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

Pandas计算每3列(季度)均值的高效方法求助

高效计算Pandas DataFrame季度均值的最优解法

嘿,针对你这个10730行的月度DataFrame转季度均值的需求,我给你分享几个矢量化、高性能的解法,绝对能解决你当前效率低下的问题!

核心思路:利用Pandas的分组矢量化操作

Pandas的groupby是底层优化过的矢量化操作,比手动循环逐列计算快N倍,尤其适合你这种大行数的数据集。下面分两种场景给出具体实现:

场景1:name列为DataFrame的索引

如果你的name已经是索引(可提前通过df = df.set_index('name')设置),直接按季度分组计算均值即可:

import pandas as pd

# 将月度列名转换为datetime格式,方便提取季度信息
month_columns = pd.to_datetime(df.columns)
# 生成季度分组键:格式为"YYYYqQ"(比如2016q1)
quarter_groups = month_columns.strftime("%Yq%q")
# 按分组键对列进行分组,计算均值
quarter_df = df.groupby(quarter_groups, axis=1).mean()

场景2:name列为普通数据列

如果name是普通列,先将其设为索引,处理完成后再恢复:

import pandas as pd

# 临时把name设为索引
temp_df = df.set_index('name')
# 转换列名为datetime并生成季度分组键
month_columns = pd.to_datetime(temp_df.columns)
quarter_groups = month_columns.strftime("%Yq%q")
# 分组计算均值,最后恢复name列
quarter_df = temp_df.groupby(quarter_groups, axis=1).mean().reset_index()

进阶优化:跳过datetime转换,直接用字符串切片

如果你的列名是严格的YYYY-MM格式,还可以直接通过字符串切片生成季度键,省去datetime转换的开销,速度会更快:

import pandas as pd

temp_df = df.set_index('name')
# 遍历列名,直接提取年份和计算季度
quarter_groups = []
for col in temp_df.columns:
    year = col[:4]
    month = int(col[5:7])
    quarter = (month - 1) // 3 + 1
    quarter_groups.append(f"{year}q{quarter}")
# 分组计算均值
quarter_df = temp_df.groupby(quarter_groups, axis=1).mean().reset_index()

为什么这个方法高效?

你之前的低效方案大概率是用了Python层面的循环(比如逐3列遍历计算),而Pandas的groupby是基于C语言实现的矢量化操作,完全避开了Python循环的开销,对于10730行的数据集,几乎是瞬间完成计算。

结果验证

针对你给出的John的示例数据:

  • 2016q1均值:(1000+1500+1800)/3 = 1433.333
  • 2016q2均值:(2000+1600+1000)/3 = 1533.333
    用上面的方法可以精准得到这个结果,完全符合需求。

内容的提问来源于stack exchange,提问作者Elias Uhalde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:39:11