Pandas分组计算排除当前行的扩展窗口均值:链式方法问题、索引对齐及高效实现咨询
Pandas分组计算排除当前行的扩展窗口均值:链式方法问题、索引对齐及高效实现咨询
需求目标
我想要实现的是:按slug字段分组,计算valuation列的扩展均值,要求排除当前行的值,并且严格遵循week的排序顺序。
示例数据集(输出为期望结果)
idx week slug valuation output 0 2 slouk -4 12.00 1 3 slouk 7 4.00 2 4 slouk 8 5.00 3 3 kenun 10 14.00 4 1 kenun 11 5 1 slouk 12 6 2 kenun 17 11.00 7 4 kenun 21 12.67
我尝试过但失败的代码
一开始我写了两种方式,但都没能得到正确结果:
# 链式调用版本 td["output"] = ( td.sort_values(by="week") .groupby("slug")["valuation"] .shift() .expanding() .mean() .reset_index(drop=True) ) # apply版本 td["output"] = ( td.sort_values(by="week") .groupby("slug")["valuation"] .apply(lambda x: x.shift().expanding().mean()) .reset_index(drop=True) )
可行的解决方案
后来我找到了相关思路,在代码中加入.sort_index(level=1)后,apply版本终于可以正常工作了:
td["output"] = ( td.sort_values(by="week") .groupby("slug")["valuation"] .apply(lambda x: x.shift().expanding().mean()) .sort_index(level=1) .reset_index(drop=True) )
不过这个apply版本在处理大数据集时速度很慢,而且我把.sort_index(level=1)加到链式调用版本里时,依然无法得到正确结果。
我的疑问
虽然功能实现了,但我还有几个点想搞明白:
- 链式方法的分组丢失问题:为什么用
td.groupby('slug')['valuation'].shift().expanding().mean()这种链式调用时,会在某个步骤后丢失分组信息?它和使用apply的本质区别是什么? - apply的索引对齐问题:用lambda+apply计算出的Series,顺序和原DataFrame不一致,直接用
.reset_index(drop=True)赋值回去会导致结果不对齐,这个赋值过程到底是怎么运作的? - 更高效的替代方案:有没有比当前apply版本更快的方法来实现这个需求?
我的核心目标是搞清楚这些Pandas方法的底层逻辑,加深理解。
备注:内容来源于stack exchange,提问作者takmers
相关产品推荐
相关产品推荐

