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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 04:01:23