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

pandas不同索引Series相减:实现成交量减去对应月度均值

Pandas实现Volume列减去所属月份均值的解决方案

原代码出错的核心原因是计算得到的month_means是两级MultiIndex(年、月)的短序列,长度等于数据中包含的月份总数,而直接传入zip(df.index.year, df.index.month)进行索引时,pandas无法完成和原DataFrame行索引的自动对齐,导致结果异常。

推荐最优实现方案是使用groupby.transform方法,该方法会返回和原DataFrame长度完全一致的序列,自动完成索引对齐,无需手动匹配年月:

import pandas as pd
import io
import numpy as np

df = pd.read_csv(io.StringIO(csv_file_content))
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')

# 一行代码完成计算,自动按年月分组对齐
df['spread_monthly'] = df['Volume'] - df.groupby([df.index.year, df.index.month])['Volume'].transform('mean').round(2)

如果你需要单独保留月度均值结果用于其他逻辑,也可以基于原有计算的month_means做索引映射实现:

# 获取每对年/月的均值
month_means = df.groupby([df.index.year, df.index.month])['Volume'].mean().round(2)
# 通过行索引映射匹配对应月份的均值
df['spread_monthly'] = df['Volume'] - df.index.map(lambda dt: month_means.loc[(dt.year, dt.month)])

两种方案均可以得到正确结果,其中transform方案运行效率更高,代码更加简洁。

内容的提问来源于stack exchange,提问作者Antonio L.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 16:45:03