Python中对Pandas DataFrame按机构求和并获取最新日期的实现方法
使用Pandas处理分组数据需求
首先加载示例数据并转换日期格式:
import pandas as pd # 构建你提供的数据集 data = { 'Organization': ['O4', 'O2', 'O1', 'O4', 'O2', 'O2'], 'Total_Founding': [50, 70, 20, 80, 30, 60], 'announced_on': ['2015-03-26', '2016-10-10', '2016-10-14', '2015-05-26', '2016-12-10', '2017-01-10'] } df = pd.DataFrame(data) # 将日期列转为datetime类型,方便后续日期计算 df['announced_on'] = pd.to_datetime(df['announced_on'])
需求1:替换每条记录的Total_Founding为组内总和
通过groupby结合transform方法,计算每个组织的Total_Founding总和,并将结果映射回原数据的每条记录:
# 按Organization分组,计算组内总和并替换原列 df['Total_Founding'] = df.groupby('Organization')['Total_Founding'].transform('sum') # 查看处理结果 print("需求1处理结果:") print(df)
处理后输出:
| Organization | Total_Founding | announced_on |
|---|---|---|
| O4 | 130 | 2015-03-26 |
| O2 | 160 | 2016-10-10 |
| O1 | 20 | 2016-10-14 |
| O4 | 130 | 2015-05-26 |
| O2 | 160 | 2016-12-10 |
| O2 | 160 | 2017-01-10 |
需求2:获取每组最新日期+组总和
这里分两种常见场景实现:
场景A:生成每个组织的汇总结果(一行对应一个组织)
使用groupby的agg方法,一次性聚合计算总和和最新日期:
# 重新加载原始数据,避免被需求1的修改影响 df = pd.DataFrame(data) df['announced_on'] = pd.to_datetime(df['announced_on']) # 分组聚合,指定每个字段的计算逻辑 summary_df = df.groupby('Organization').agg( Total_Founding_Sum=('Total_Founding', 'sum'), Latest_Announced_Date=('announced_on', 'max') ).reset_index() # 查看汇总结果 print("\n需求2场景A(组织汇总):") print(summary_df)
输出:
| Organization | Total_Founding_Sum | Latest_Announced_Date |
|---|---|---|
| O1 | 20 | 2016-10-14 |
| O2 | 160 | 2017-01-10 |
| O4 | 130 | 2015-05-26 |
场景B:保留原记录结构,替换为组内总和+最新日期
同样用transform分别处理两个字段,保留原数据的行数:
# 重新加载原始数据 df = pd.DataFrame(data) df['announced_on'] = pd.to_datetime(df['announced_on']) # 替换Total_Founding为组总和 df['Total_Founding'] = df.groupby('Organization')['Total_Founding'].transform('sum') # 替换announced_on为组内最新日期 df['announced_on'] = df.groupby('Organization')['announced_on'].transform('max') # 查看处理结果 print("\n需求2场景B(保留原记录):") print(df)
输出:
| Organization | Total_Founding | announced_on |
|---|---|---|
| O4 | 130 | 2015-05-26 |
| O2 | 160 | 2017-01-10 |
| O1 | 20 | 2016-10-14 |
| O4 | 130 | 2015-05-26 |
| O2 | 160 | 2017-01-10 |
| O2 | 160 | 2017-01-10 |
内容的提问来源于stack exchange,提问作者Rebeka
相关产品推荐
相关产品推荐

