为什么pandas.groupby执行apply操作后会保留分组键列?
原因说明
你在groupby().apply()的传入函数中,仅将date列设置为子DataFrame的索引,id列始终作为普通数值列保留在子表中。diff()方法默认会对表中所有数值类型的列执行逐行差分计算,因此最终结果不仅保留了id列,还计算出了同组内相邻行id的差分值——同组id值完全相同,所以差分值为0.0。
本质是groupby.apply()在拆分分组时,会把原表所有列都传入每个分组对应的子DataFrame,你没有在函数内主动移除id列,它自然会参与后续计算并出现在结果里。
实现预期结果的方法
- 方法1(性能更优的写法,也是你自己验证通过的逻辑):先设置多层索引再分组差分,避免
apply的额外循环开销,代码如下:
t.set_index(['id', 'date']).groupby(level=0).diff()
- 方法2:如果要在
apply逻辑内完成计算,只需要在设置索引后主动移除id列即可,代码如下:
t.groupby('id').apply(lambda df: df.set_index('date').drop(columns=['id']).diff())
内容的提问来源于stack exchange,提问作者Lei Hao
相关产品推荐
相关产品推荐

