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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:10:59