如何在pandas的ffill()操作中保留分组列subject_id?
解决ffill后丢失subject_id列的问题
我明白你的问题了——在按subject_id分组执行ffill()后,分组列subject_id消失了对吧?这其实是默认的groupby行为导致的,我给你几个简单的解决办法:
问题原因
当你用df2.groupby('subject_id').ffill()时,pandas默认会把分组键subject_id设置为结果的索引(as_index=True),所以它不再作为普通列显示出来了。
解决方法
1. 分组时保留subject_id为列
直接在groupby里设置as_index=False,这样分组键就会一直以列的形式存在:
df2 = df2.groupby('subject_id', as_index=False).ffill()
如果你之前试这个没生效,可以先执行print(df2.columns)确认一下df2在执行这行前确实有subject_id列,可能是之前的步骤里不小心把它弄丢了?
2. 重置索引恢复subject_id
如果还是想用默认的分组设置,那在ffill()之后把索引重置回列就行:
df2 = df2.groupby('subject_id').ffill().reset_index(level='subject_id')
这里用reset_index(level='subject_id')只把分组索引变回列,不会影响其他可能存在的索引。
3. 仅填充需要的列(更精准)
其实subject_id在每个分组里都是固定值,根本不需要填充,我们可以只对其他列执行填充操作:
# 筛选出需要填充的列(排除subject_id) fill_columns = [col for col in df2.columns if col != 'subject_id'] # 只对这些列按组填充 df2[fill_columns] = df2.groupby('subject_id')[fill_columns].ffill()
这种方式最稳妥,完全不会影响subject_id列的存在和值。
你可以试试这几种方法,应该就能得到包含subject_id列的期望输出了。
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

