Pandas按ID匹配后将映射表多行值聚合为列表列的方法
Pandas 按匹配键聚合关联列生成列表列实现方案
以下两种实现方式均无需构建冗余临时DataFrame,执行效率显著高于逐行遍历、多轮临时表赋值的写法,可直接复用。
方法1:分组聚合后映射(性能最优,推荐大数据量使用)
核心逻辑是先对映射表按关联键做聚合,生成键到编码列表的字典,直接映射到主表,避免全表关联的额外开销:
import pandas as pd # 对映射表按关联id分组,将对应Code聚合为列表,转为映射字典 code_mapping = map_df.groupby('id_for_map')['Code'].agg(list).to_dict() # 直接映射生成新列 main_df['code'] = main_df['id'].map(code_mapping)
如果存在主表id在映射表中无匹配的场景,对应位置会返回NaN,需要补空列表的话追加一行处理即可:
main_df['code'] = main_df['code'].fillna(main_df['code'].apply(lambda x: []))
方法2:左连接后聚合(逻辑直观,适合复杂关联场景)
如果后续需要在关联过程中增加字段筛选、多表关联等复杂逻辑,可以用左连接保留主表全部行后,再按主表唯一键聚合:
# 左连接关联两张表 merged_df = pd.merge( main_df, map_df[['id_for_map', 'Code']], left_on='id', right_on='id_for_map', how='left' ) # 按主表原有字段分组,聚合Code为列表 main_df = merged_df.groupby(['name', 'id'], as_index=False)['Code'].agg(list).rename(columns={'Code':'code'})
结果校验
两种方法执行后得到的main_df完全匹配预期结构:
name id code 0 'tree' 0 ['aa'] 1 'foo' 1 ['ab','ac'] 2 'apple' 2 ['ba','bb'] 3 'table' 3 ['bb']
内容的提问来源于stack exchange,提问作者Botond Nagy
相关产品推荐
相关产品推荐

