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

如何用Pandas GroupBy生成以指定列为键的聚合字典?

解决DataFrame分组生成聚合字典的问题

直接上实操代码,先构造匹配你需求的示例数据,再分步实现目标:

1. 示例数据准备

import pandas as pd

# 模拟explode后的start_df结构
data = {
    'child_id': [1, 1, 1, 2, 2],
    'parent_id': [101, 101, 102, 201, 202],
    'parent_name': ['父节点A', '父节点A', '父节点B', '父节点C', '父节点D'],
    'tag_id': ['t001', 't002', 't003', 't004', 't005']
}
start_df = pd.DataFrame(data)

2. 方法一:agg结合lambda实现

直接在groupby.agg中为每个目标字段指定聚合逻辑,核心用lambda关联多列生成字典:

output_df = start_df.groupby('child_id').agg(
    # 生成去重的parent_id列表
    parent_id_list=('parent_id', lambda x: list(x.unique())),
    # 生成所有tag_id的列表(保留重复值)
    full_tag_id_list=('tag_id', list),
    # 生成{parent_id: parent_name}的字典(自动去重同parent_id的name)
    parent_desc_dict=('parent_id', lambda x: dict(zip(x.unique(), start_df.loc[x.index, 'parent_name'].unique()))),
    # 生成{parent_id: 对应tag_id列表}的字典
    tag_ancestry=('parent_id', lambda x: {pid: start_df.loc[x[x == pid].index, 'tag_id'].tolist() for pid in x.unique()})
).reset_index()

3. 方法二:apply处理整组数据(更直观)

如果觉得agg嵌套逻辑绕,直接对每个分组的子DataFrame操作,可读性更强:

def process_group(group):
    # 提取分组内唯一的parent_id集合
    unique_parents = group['parent_id'].unique()
    return pd.Series({
        'parent_id_list': list(unique_parents),
        'full_tag_id_list': group['tag_id'].tolist(),
        'parent_desc_dict': dict(zip(unique_parents, group['parent_name'].unique())),
        'tag_ancestry': {pid: group[group['parent_id'] == pid]['tag_id'].tolist() for pid in unique_parents}
    })

output_df = start_df.groupby('child_id').apply(process_group).reset_index()

关键注意事项

  • 字典键具有唯一性,若数据中存在同一parent_id对应不同parent_name的情况,字典会保留最后一个匹配的名称,需提前清洗数据(比如取第一个、合并或去重)
  • 若不需要去重(保留explode后的所有重复值),去掉代码中的unique()即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:57:35