如何在熊猫中为每个组做前向填充

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

我想在前向填充中对列 ABC 进行空值插补,但针对每个组。这意味着,我希望对每个id 应用前向填充。我该怎么做?

【问题讨论】:

【参考方案1】:

使用GroupBy.ffill 对所有列的每组进行前向填充,但如果每组的第一个值为NaNs,则无法替换,因此可以使用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 值

如何在 Jsonnet 中为 Grafana 仪表板模板填充变量

如何在每个组中估算熊猫数据框中的一列[重复]