You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 03:19:35