假设我有一个这样的数据框架:
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()
但是它把第三行地址改成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
有没有办法让熊猫保持原样?
在最后一个分配中,您不是只过滤非NaN名称行。相反,您将为所有行分配分组结果。
应该可以解决这个问题:
df.loc[df['name'].notna(),['address', 'email']] = df[df['name'].notna()].groupby('name', sort=False)[['address', 'email']].ffill()
通过这种方式,您只能为Name不同于NaN的行分配结果