Python:如何迭代对数据框列表中各列按年份分组求和?
解决方案:按年份对DataFrame列表分组求和
针对你的需求,我们可以通过一个通用函数处理单个DataFrame,再批量遍历列表完成所有数据的求和操作,兼容季度、月度等多频次时间格式。
实现代码
import pandas as pd def sum_by_year(df): # 获取第一列的列名 year_col = df.columns[0] # 提取年份:自动适配datetime类型或字符串格式的时间(如YYYYQx、YYYY-MM) if pd.api.types.is_datetime64_any_dtype(df[year_col]): df['temp_year'] = df[year_col].dt.year else: # 从字符串中截取前4位作为年份并转为整数 df['temp_year'] = df[year_col].str[:4].astype(int) # 按年份分组,仅对数值列求和,重置索引保持结构 summed_df = df.groupby('temp_year').sum(numeric_only=True).reset_index() # 恢复原第一列的列名,删除临时列逻辑已整合在重命名中 summed_df = summed_df.rename(columns={'temp_year': year_col}) return summed_df # 批量处理整个DataFrame列表 output = [sum_by_year(df) for df in Input]
代码说明
- 年份提取逻辑:自动识别第一列是
datetime类型还是字符串类型,分别用dt.year或字符串截取的方式提取年份,兼容绝大多数时间格式。 - 分组求和:使用
groupby按年份聚合,numeric_only=True确保只对数值列计算,避免非数值列干扰。 - 结构一致性:重置索引并恢复原第一列的列名,保证输出的DataFrame和输入结构完全匹配。
- 批量处理:通过列表推导式遍历整个
Input列表,快速生成结果列表output。
示例验证
1. 季度数据示例
# 构造示例输入DataFrame sample_q_df = pd.DataFrame({ '季度': ['2021Q1', '2021Q2', '2021Q3', '2021Q4', '2022Q1', '2022Q2'], '销售额': [100, 150, 200, 180, 220, 250], '利润': [20, 30, 40, 35, 45, 50] }) # 处理后输出 summed_q = sum_by_year(sample_q_df) print(summed_q)
输出结果:
季度 销售额 利润 0 2021 630 125 1 2022 470 95
2. 月度datetime数据示例
sample_m_df = pd.DataFrame({ '日期': pd.to_datetime(['2021-01-01', '2021-02-01', '2021-12-01', '2022-01-01']), '用户量': [500, 600, 800, 700] }) summed_m = sum_by_year(sample_m_df) print(summed_m)
输出结果:
日期 用户量 0 2021 1900 1 2022 700
内容的提问来源于stack exchange,提问作者Karush Kuhn Tucker
相关产品推荐
相关产品推荐

