如何对DataFrame指定列求和并正确处理datetime日期列?
按人员汇总DataFrame并合并日期区间的解决方案
原数据与需求
原DataFrame(日期列已转为datetime类型)
import pandas as pd data = { 'Name': ['John', 'Betty', 'Bruce', 'John', 'Betty'], 'Amount': [11, 13, 17, 19, 27], 'Start_date': pd.to_datetime(['01/01/2022', '01/01/2022', '01/01/2022', '02/01/2022', '04/17/2022']), 'End_date': pd.to_datetime(['01/02/2022', '04/16/2022', '05/17/2022', '03/19/2022', '06/30/2022']), 'Country': ['USA', 'China', 'Germany', 'USA', 'China'] } df = pd.DataFrame(data)
需求
- 按人员汇总
Amount列的数值 - 合并日期区间:新的
Start_date为该人员最早的起始日,End_date为最晚的结束日(题目说明区间无间隔,旧结束日次日即为新起始日) - 原样保留
Country列(同一人员的Country值一致)
解决方案
直接使用groupby结合agg方法,一次性完成所有聚合操作,不会破坏原DataFrame:
# 分组聚合 result_df = df.groupby('Name').agg( Amount=('Amount', 'sum'), Start_date=('Start_date', 'min'), End_date=('End_date', 'max'), Country=('Country', 'first') ).reset_index() # 可选:将日期格式化为MM/DD/YYYY(与原数据显示一致) result_df['Start_date'] = result_df['Start_date'].dt.strftime('%m/%d/%Y') result_df['End_date'] = result_df['End_date'].dt.strftime('%m/%d/%Y') print(result_df)
代码说明
groupby('Name'):按人员姓名分组agg():为每列指定聚合逻辑:Amount:用sum汇总该人员的所有金额Start_date:用min取该人员最早的起始日期End_date:用max取该人员最晚的结束日期(因区间无间隔,直接取首尾即可覆盖完整周期)Country:用first取该组第一条数据的Country值(同一人员Country一致,取任意值均可)
reset_index():将分组的Name从索引转换为普通列,还原成常规DataFrame结构
输出结果
Name Amount Start_date End_date Country 0 Betty 40 01/01/2022 06/30/2022 China 1 Bruce 17 01/01/2022 05/17/2022 Germany 2 John 30 01/01/2022 03/19/2022 USA
内容的提问来源于stack exchange,提问作者Xtiaan
相关产品推荐
相关产品推荐

