如何在Pandas分组(groupby)后仅对单个列执行插值(interpolate)?
Pandas分组内仅对单列执行插值操作
在对DataFrame按filename分组插值时,若只想针对单个列(如val2)处理,直接在apply中提取单列操作会导致其他列丢失。以下是具体的解决方法:
输入数据
filename val1 val2 t 1 file1.csv 5 10 2 file1.csv NaN NaN 3 file1.csv 15 20 6 file2.csv NaN NaN 7 file2.csv 10 20 8 file2.csv 12 15
期望输出
filename val1 val2 t 1 file1.csv 5 10 2 file1.csv NaN 15 3 file1.csv 15 20 6 file2.csv NaN NaN 7 file2.csv 10 20 8 file2.csv 12 15
问题分析
你之前的代码仅返回插值后的val2列,是因为lambda表达式直接返回了group['val2'].interpolate(...),相当于只提取了目标列,原DataFrame的其他列被丢弃。
解决方案
方法1:使用transform(推荐)
transform会将分组内的计算结果映射回原DataFrame的对应位置,完美保留其他列数据:
df['val2'] = df.groupby('filename')['val2'].transform(lambda x: x.interpolate(method='index'))
方法2:使用apply配合assign
通过assign在原分组数据上修改val2列,返回完整的分组结果:
df = df.groupby('filename').apply(lambda group: group.assign(val2=group['val2'].interpolate(method='index'))).reset_index(drop=True)
如果不需要重置索引,可以去掉.reset_index(drop=True)。
两种方法都能实现仅对val2列按组插值,同时保留filename、val1列的原始数据,得到符合预期的输出。
内容的提问来源于stack exchange,提问作者dch2404
相关产品推荐
相关产品推荐

