Pandas 数据框使用其他已知列的值进行fillna()填充空值

3

考虑以下示例df:

   Other1  Other2     Name Value
0       0       1  Johnson     C
1       0       0  Johnson   NaN
2       1       1    Smith     R
3       1       1    Smith   NaN
4       0       1  Jackson     X
5       1       1  Jackson   NaN
6       1       1  Jackson   NaN

我希望能够用该行中与给定名称关联的df['Value']值来填充NaN值。我的期望结果如下,我知道可以通过以下方式实现:

df['Value'] = df['Value'].fillna(method='ffill')

   Other1  Other2     Name Value
0       0       1  Johnson     C
1       0       0  Johnson     C
2       1       1    Smith     R
3       1       1    Smith     R
4       0       1  Jackson     X
5       1       1  Jackson     X
6       1       1  Jackson     X

然而,如果名称不是按顺序排列的,则此解决方案将无法达到预期的结果。我也不能按df['Name']排序,因为顺序很重要。是否有一种有效的方法仅通过其关联的名称值填充给定的NaN值并将其分配给该值?

另外需要注意的是,给定名称始终只与单个值相关联。提前致谢。

1个回答

5
你应该使用groupbytransform
df['Value'] = df.groupby('Name')['Value'].transform('first')
df

   Other1  Other2     Name Value
0       0       1  Johnson     C
1       0       0  Johnson     C
2       1       1    Smith     R
3       1       1    Smith     R
4       0       1  Jackson     X
5       1       1  Jackson     X
6       1       1  Jackson     X

Peter的答案不正确,因为第一个有效值可能不总是在组中的第一个位置,这种情况下ffill将使用上一组的值来污染下一组。

ALollz的答案很好,但是dropna会产生一定程度的开销。


1
是的,如果一个名称有多个实例,我可能还需要在代码中加入 drop_duplicates()。这就是正确的做法 :D。 - ALollz
假设我的列名不是Value,如果它包含一个斜杠(例如'T/F'),那么我最好重命名列名,还是有一种方法可以引用该列名而不会出现语法错误? - rahlf23
关于处理可能存在零个有效值的名称,你提出了一个好点子。请注意,如果任何名称显示出多个值,则此解决方案将悄无声息地丢失数据。 - Peter Leimbigler
@coldspeed,你两周前回答了一个问题,使用了 df.dot,能否分享一下链接?我查找了但没有找到。 - Pyd
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接