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
相关产品推荐
相关产品推荐

