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

如何按Account与年份分组求和Pandas DataFrame并保留年末日期

问题描述

我有一个名为df的Pandas DataFrame,结构如下:

AccountTypeDatePerValue
AFC31/03/20193Ma
AFC30/06/20193Mb
AFC30/09/20193Mc
AFC31/12/20193Md
BP&G31/03/20193Me
BP&G30/06/20193Mf
BP&G30/09/20193Mg
BP&G31/12/20193Mh

其中a、b、c、d、e、f、g、h为数值。需要按Account列分组,对同一年份的Value列求和,同时结果中Date列取该分组对应年份的最后一个周期日期,最终得到如下结果:

AccountTypeDatePerValue
AFC31/12/20193Ma+b+c+d
BP&G31/12/20193Me+f+g+h

我尝试了以下代码,但结果不符合需求:

test_df = pd.DataFrame(df.groupby('Date').sum().reset_index())
解决方案

实现代码

import pandas as pd

# 转换Date列为日期类型,方便处理年份和排序
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')

# 提取年份作为分组辅助列
df['Year'] = df['Date'].dt.year

# 分组聚合:按Account和Year分组,指定各列的聚合规则
result_df = df.groupby(['Account', 'Year'], as_index=False).agg(
    Type=('Type', 'first'),
    Date=('Date', 'last'),
    Per=('Per', 'first'),
    Value=('Value', 'sum')
)

# 将Date列转回原格式(dd/mm/yyyy)
result_df['Date'] = result_df['Date'].dt.strftime('%d/%m/%Y')

# 删除临时的Year列
result_df = result_df.drop('Year', axis=1)

print(result_df)

代码说明

  1. 日期类型转换:把Date列转为日期类型,避免字符串排序的误差,同时能准确提取年份和判断每组的最后日期。
  2. 分组逻辑:按Account+Year分组,确保同一账号同一年的数据被聚合。
  3. 聚合规则:
    • Type和Per:同一账号下值固定,用first或last提取均可;
    • Date:用last获取该年份最后一个周期的日期;
    • Value:用sum完成数值求和。
  4. 格式还原:把Date列转回原字符串格式,删除临时的Year列,得到符合需求的结果。

内容的提问来源于stack exchange,提问作者Valeria Arango

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:55:30