python pandas条件正向填充保留一些行不变



假设我有一个这样的数据框架:

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的行分配结果

最新更新