You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按id分组对整个DataFrame执行前向填充的问题

按ID分组对整个DataFrame执行前向填充的高效方案

看起来你在使用groupby+fillna处理整个DataFrame时踩了个小坑,这个KeyError: "isin"确实挺让人困惑的。别担心,有几个简单高效的办法能实现你想要的效果:

最简洁的方案:直接调用GroupBy的ffill方法

pandas的分组对象本身就提供了ffill()方法,专门用来做前向填充,直接对所有列生效,代码超简洁:

df = df.groupby('id').ffill(limit=2)

这个方法会自动遍历每个ID分组里的所有列,用前一个非空值填充NaN,完全符合你的需求,而且效率比单独处理每一列高多了。

兼容旧版本的备选方案:用apply配合fillna

如果你的pandas版本比较老(比如低于1.3.0),GroupBy.ffill()可能还没支持,那就用apply来逐组处理整个DataFrame:

df = df.groupby('id').apply(lambda x: x.fillna(method='ffill', limit=2))

这种方式和你单独处理列的逻辑本质一样,但一次性搞定所有列,不用重复写代码。

为啥原来的代码会报错?

你之前用df.groupby("id").fillna(method="ffill", limit=2)出错,是因为GroupBy的fillna方法和普通DataFrame的fillna参数不一样——它并不支持method这个参数(至少在部分旧版本里是这样),所以才会抛出奇怪的KeyError。而单独处理某一列时,你操作的是SeriesGroupBy对象,它的fillna是支持method参数的,所以能正常运行。

测试验证

用你的示例原始数据:

id date number number2
1 2001 4     11
1 2002 4     45
1 2003 NaN   13
2 2001 7     NaN
2 2002 8     2

使用上述任意一种方法处理后,都能得到你期望的结果:

id date number number2
1 2001 4     11
1 2002 4     45
1 2003 4     13
2 2001 7     NaN
2 2002 8     2

要是处理后索引出现混乱,只需要加上reset_index(drop=True)就能重置索引,不过默认情况下groupby.ffill会保留原数据的结构,一般不需要额外操作。

内容的提问来源于stack exchange,提问作者freddy888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:55:10