Pandas按ID与年份分组合并行 满足条件时自定义列值聚合金额
Pandas 分组聚合处理方案
核心逻辑按ID、Year双维度分组后,通过判断每组Qualified列的取值集合走不同处理分支,最终输出和原表结构完全一致,具体实现步骤如下:
- 分组标记识别:给每条记录附加所属分组的属性标记,区分「同组同时存在Yes/No两种Qualified值」和「同组仅存在单一Qualified值」两类数据
- 分支处理:
- 对需要合并的双取值分组:执行聚合操作,
Qualified固定赋值为Partial,Amount A、Amount B分别做求和计算,每个分组输出单行结果 - 对无需合并的单取值分组:直接保留原始记录的所有字段值,不做任何修改
- 对需要合并的双取值分组:执行聚合操作,
- 结果合并:将两部分处理结果拼接,按原表的字段顺序重排列后输出最终结果
可直接运行的代码实现
import pandas as pd # --------------- 以下为测试样例(可替换为你自己的实际数据)--------------- # 构造的测试数据完全匹配描述的输入场景 df = pd.DataFrame([ [1, "No", 2018, 100, 200], [1, "Yes", 2018, 150, 50], [1, "No", 2019, 80, 300], [1, "Yes", 2019, 120, 90], [1, "Yes", 2020, 300, 400], [2, "No", 2018, 50, 70], [3, "Yes", 2019, 220, 180] ], columns=["ID", "Qualified", "Year", "Amount A", "Amount B"]) # ------------------------------------------------------------------------ # 1. 生成分组标记:判断每条记录所属(ID,Year)组是否同时包含Yes、No两个取值 is_mixed_group = df.groupby(["ID", "Year"])["Qualified"].transform( lambda x: set(x) == {"Yes", "No"} ) # 2. 处理需要合并的混合取值组 agg_result = df[is_mixed_group].groupby(["ID", "Year"], as_index=False).agg( Qualified=("Qualified", lambda _: "Partial"), **{"Amount A": ("Amount A", "sum"), "Amount B": ("Amount B", "sum")} ) # 3. 提取不需要合并的单取值组原始记录 raw_result = df[~is_mixed_group] # 4. 拼接结果,按原表字段顺序输出 final_df = pd.concat([agg_result, raw_result], ignore_index=True)[df.columns]
效果说明
处理后ID=1的2018、2019年两条记录会分别合并为单行,Qualified取值为Partial,两个金额字段为同组对应值的和;ID=1的2020年记录、其余ID的所有单年份记录会完全保留原始值,输出表的字段名、字段顺序和输入DataFrame完全一致。
内容的提问来源于stack exchange,提问作者pythong
相关产品推荐
相关产品推荐

