编写可复用函数为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
相关产品推荐
相关产品推荐

