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