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

编写可复用函数为Pandas DataFrame按年份添加年度平均值列

自动为Pandas DataFrame按年份生成每行平均值列

方案思路

核心逻辑是自动识别日期列、按年份分组列、计算每行的年份平均值,全程无需手动指定列名,适配任意数量的年份列。

高效实现代码

推荐用Pandas内置的groupby配合正则筛选,代码简洁且性能高效:

import pandas as pd

# 1. 筛选所有YYYY-MM-DD格式的日期列,按年份分组计算每行均值
year_avg_df = Data.filter(regex=r'^\d{4}-\d{2}-\d{2}$').groupby(lambda col_name: col_name[:4], axis=1).mean()

# 2. 重命名均值列,加上_avg后缀
year_avg_df.columns = [f"{year}_avg" for year in year_avg_df.columns]

# 3. 将均值列合并回原DataFrame
Data = pd.concat([Data, year_avg_df], axis=1)

分步解释

  • 筛选日期列:filter(regex=r'^\d{4}-\d{2}-\d{2}$') 精准匹配YYYY-MM-DD格式的列名,自动排除State列及其他非日期列。
  • 按年份分组计算:groupby(lambda col_name: col_name[:4], axis=1) 以列名的前4位(年份)为分组依据,按列分组后调用mean(axis=1)计算每行的平均值。
  • 合并结果:用pd.concat横向合并原DataFrame和均值列DataFrame,保留所有原始数据的同时新增均值列。

适配特殊情况

如果日期列名格式不是YYYY-MM-DD(比如20080229),只需调整正则表达式和年份提取逻辑:

# 针对YYYYMMDD格式的列名
year_avg_df = Data.filter(regex=r'^\d{8}$').groupby(lambda col_name: col_name[:4], axis=1).mean()

如果需要排除其他非日期列(不止State),可以手动指定保留列的逻辑:

# 排除指定列,保留其余疑似日期列
date_cols = [col for col in Data.columns if col not in ['State', 'OtherNonDateCol']]
year_avg_df = Data[date_cols].groupby(lambda col_name: col_name[:4], axis=1).mean()

内容的提问来源于stack exchange,提问作者Belinda Zhang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:10:30