如何用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
相关产品推荐
相关产品推荐

