python pandas 有条件的正向填充保留一些行不变
python pandas conditional forward fill leave some rows untouched
假设我有一个这样的数据框:
name address email paid
0 John 123 State St john@example.com 5.00
1 NaN NaN NaN 15.00
2 John NaN NaN 3.00
3 NaN 100 Owen Ave NaN 10.00
我想在名称相同时转发地址和电子邮件列,如果名称为 NaN,则保留该行不变,这样做之后,数据框应如下所示:
name address email paid
0 John 123 State St john@example.com 5.00
1 NaN NaN NaN 15.00
2 John 123 State St john@example.com 3.00
3 NaN 100 Owen Ave NaN 10.00
我试过使用
df[['address', 'email']] = df[df['name'].notna()].groupby('name', sort=False)[['address', 'email']].ffill()
但它会像这样将第 3 行地址更改为 NaN
name address email paid
0 John 123 State St john@example.com 5.00
1 NaN NaN NaN 15.00
2 John 123 State St john@example.com 3.00
3 NaN NaN NaN 10.00
有没有办法让pandas保留一些行?
在上次作业中,您没有过滤仅非 NaN 名称行。您正在为所有行分配 group-by 结果。
这应该可以解决问题:
df.loc[df['name'].notna(),['address', 'email']] = df[df['name'].notna()].groupby('name', sort=False)[['address', 'email']].ffill()
这样,您只为名称不同于 NaN 的行分配结果
假设我有一个这样的数据框:
name address email paid
0 John 123 State St john@example.com 5.00
1 NaN NaN NaN 15.00
2 John NaN NaN 3.00
3 NaN 100 Owen Ave NaN 10.00
我想在名称相同时转发地址和电子邮件列,如果名称为 NaN,则保留该行不变,这样做之后,数据框应如下所示:
name address email paid
0 John 123 State St john@example.com 5.00
1 NaN NaN NaN 15.00
2 John 123 State St john@example.com 3.00
3 NaN 100 Owen Ave NaN 10.00
我试过使用
df[['address', 'email']] = df[df['name'].notna()].groupby('name', sort=False)[['address', 'email']].ffill()
但它会像这样将第 3 行地址更改为 NaN
name address email paid
0 John 123 State St john@example.com 5.00
1 NaN NaN NaN 15.00
2 John 123 State St john@example.com 3.00
3 NaN NaN NaN 10.00
有没有办法让pandas保留一些行?
在上次作业中,您没有过滤仅非 NaN 名称行。您正在为所有行分配 group-by 结果。
这应该可以解决问题:
df.loc[df['name'].notna(),['address', 'email']] = df[df['name'].notna()].groupby('name', sort=False)[['address', 'email']].ffill()
这样,您只为名称不同于 NaN 的行分配结果