如何在熊猫中为每个组做前向填充
Posted
技术标签:
【中文标题】如何在熊猫中为每个组做前向填充【英文标题】:How to do forward filling for each group in pandas 【发布时间】:2019-05-10 19:46:54 【问题描述】:我有一个类似于下面的数据框
id A B C D E
1 2 3 4 5 5
1 NaN 4 NaN 6 7
2 3 4 5 6 6
2 NaN NaN 5 4 1
我想在前向填充中对列 A
、B
、C
进行空值插补,但针对每个组。这意味着,我希望对每个id
应用前向填充。我该怎么做?
【问题讨论】:
【参考方案1】:使用GroupBy.ffill
对所有列的每组进行前向填充,但如果每组的第一个值为NaN
s,则无法替换,因此可以使用fillna
并最后转换为整数:
print (df)
id A B C D E
0 1 2.0 3.0 4.0 5 NaN
1 1 NaN 4.0 NaN 6 NaN
2 2 3.0 4.0 5.0 6 6.0
3 2 NaN NaN 5.0 4 1.0
cols = ['A','B','C']
df[['id'] + cols] = df.groupby('id')[cols].ffill().fillna(0).astype(int)
print (df)
id A B C D E
0 1 2 3 4 5 NaN
1 1 2 4 4 6 NaN
2 2 3 4 5 6 6.0
3 2 3 4 5 4 1.0
详情:
print (df.groupby('id')[cols].ffill().fillna(0).astype(int))
id A B C
0 1 2 3 4
1 1 2 4 4
2 2 3 4 5
3 2 3 4 5
或者:
cols = ['A','B','C']
df.update(df.groupby('id')[cols].ffill().fillna(0))
print (df)
id A B C D E
0 1 2.0 3.0 4.0 5 NaN
1 1 2.0 4.0 4.0 6 NaN
2 2 3.0 4.0 5.0 6 6.0
3 2 3.0 4.0 5.0 4 1.0
【讨论】:
我只想在某些列上执行此操作,就像您上一个示例一样,但是当我使用您的代码时,我会丢失其他列,例如D到E @H.Z. - 似乎你忘记了df[['id'] + cols] =
并且只使用了df =
。
我也有那篇文章...它只是在末尾增加了一列!
@H.Z. - 有趣,对我来说效果很好。添加了update
的替代解决方案,你能检查一下吗?
fillna(0)
在此示例中是否执行任何操作?我看不到任何 NaN 值现在为零,实际上我根本看不到任何零。可以错过吗?以上是关于如何在熊猫中为每个组做前向填充的主要内容,如果未能解决你的问题,请参考以下文章
如何在pytorch中为nn.Transformer编写一个前向钩子函数?
在 pandas 数据帧中使用前向和后向填充填充缺失值(ffill 和 bfill)
如何在 pandas DataFrame 中以衰减速率前向填充 NaN 值