多索引(MultiIndex)下仅对指定列执行前向填充(ffill)的实现方法咨询
如何在MultiIndex的DataFrame中仅对指定列执行前向填充(ffill)?
嘿,我看你遇到了在MultiIndex(ID+time)的DataFrame里,只想给col3和col4这两列做前向填充的问题,刚好我之前处理过类似场景,来给你一步步解决~
先明确下你的原始数据(整理成清晰的表格):
| ID | time | col1 | col2 | col3 | col4 |
|---|---|---|---|---|---|
| id1 | t1 | 10 | NaN | NaN | 1 |
| id1 | t2 | 10 | 110 | 1 | NaN |
| id1 | t3 | 12 | NaN | NaN | NaN |
| id2 | t1 | 12 | 109 | 15 | 1 |
| id2 | t4 | 12 | 109 | NaN | 1 |
| id2 | t7 | 20 | NaN | NaN | NaN |
你期望的填充结果是:
| ID | time | col1 | col2 | col3 | col4 |
|---|---|---|---|---|---|
| id1 | t1 | 10 | NaN | NaN | 1 |
| id1 | t2 | 10 | 110 | 1 | 1 |
| id1 | t3 | 12 | NaN | 1 | 1 |
| id2 | t1 | 12 | 109 | 15 | 1 |
| id2 | t4 | 12 | 109 | 15 | 1 |
| id2 | t7 | 20 | NaN | 15 | 1 |
先说说你尝试的代码问题:
- 第一个
df[['col3','col4']].ffill():没有考虑MultiIndex的分组逻辑,它会直接在整个列上跨ID填充,这显然不是你要的效果。 - 第二个
df[['col3','col4']].fillna(df.groupby(['ID','t'])[['col3', 'col4']].ffill()):分组键错了!按ID+time分组的话,每个组只有一行,根本没法做前向填充,应该只按ID分组才对。 - 第三个
df.reindex(['ID','t'], method='ffill'):reindex是用来重新调整索引的,不是做列填充的,参数用法也不对,所以才会报'expected Tuple, got str'的错误。
正确的解决方法
核心逻辑是:按ID分组,在每个ID组内对col3和col4执行前向填充,再把填充后的列替换回原DataFrame,这样不会影响其他列的原始数据。
直接上代码:
# 按ID分组,对指定列执行组内前向填充 filled_cols = df.groupby('ID')[['col3', 'col4']].ffill() # 将填充后的列赋值回原DataFrame df[['col3', 'col4']] = filled_cols
或者可以一步到位:
df[['col3', 'col4']] = df.groupby('ID')[['col3', 'col4']].ffill()
补充说明
如果你的time索引不是按顺序排列的,建议先对整个DataFrame按索引排序,确保每个ID下的时间是递增的:
df = df.sort_index()
这样执行后,每个ID下的col3和col4缺失值都会被该ID之前的有效值填充,完全符合你的期望结果~
内容的提问来源于stack exchange,提问作者noiivice
相关产品推荐
相关产品推荐

