如何用pandas按id合并动态列DataFrame并聚合非id列为字典列表
解决方案
可以通过pandas实现该需求,以下是适配动态列场景的高效优化方案,无需硬编码非id字段:
实现思路
- 先加工DataFrame2:按
id字段分组,将每组内除id外的所有动态字段逐行转为字典,聚合为列表 - 对加工后的DataFrame2和原始DataFrame1做全外连接,匹配
id字段 - 关联后未匹配到的
concatinated字段填充为空列表即可
完整代码
import pandas as pd # 示例数据构造,实际使用时替换为自己的DataFrame读入逻辑即可 df1 = pd.DataFrame({'id': [1, 2, 3], 'dept': [101, 102, 103]}) df2 = pd.DataFrame({'id': [1, 1, 5], 'region1': ['CUD', 'DAS', 'ITF'], 'region2': ['IOP', 'POL', 'IJK']}) # 处理df2:按id聚合并行转字典 df2_agg = df2.groupby('id').apply( lambda x: x.drop('id', axis=1).to_dict('records'), include_groups=False # pandas 1.x版本可删除该参数,不影响运行结果 ).reset_index(name='concatinated') # 全外连接两个表 res = pd.merge(df1, df2_agg, on='id', how='outer') # 空值填充为空白列表 res['concatinated'] = res['concatinated'].fillna('').apply(lambda x: x if x else []) # 查看结果 print(res)
方案优势
- 完全适配动态列场景:自动识别所有非
id字段,字段数量、名称变更时无需修改代码 - 性能较高:基于pandas原生接口实现,避免手动循环遍历,万级以上数据量也可快速处理
- 结果完全匹配需求:左表不存在的id对应
dept自动设为空值,未关联到数据的行concatinated返回空白列表
内容的提问来源于stack exchange,提问作者Kalai Chelvan
相关产品推荐
相关产品推荐

