给出以下示例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
我希望能够用与该行中给定名称关联的NaN
值填充df['Value']
值。我希望得到的结果如下,我知道可以这样实现:
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
值并将其分配给该值?
同样重要的是要注意,给定的名称将始终仅具有与之关联的单个值。预先谢谢你。
答案 0 :(得分:4)
您应使用groupby
和transform
:
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
彼得的答案是不正确的,因为第一个有效值可能并不总是组中的第一个有效值,在这种情况下,ffill
会用前一组的值污染下一个组。
ALollz的回答很好,但是dropna
会产生一定程度的开销。