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

Pandas:合并含重复列的子DataFrame,更新主DataFrame为稀疏矩阵

基于ID合并多DataFrame生成稀疏矩阵

问题场景

主DataFrame结构如下(含ID列及多列基础数据):

ID     A       B       C 
01     1x      1y      1z 
02     2x      2y      2z 
03     3x      3y      3z 
04     4x      4y      4z 
... 
01000  01000x  01000y  01000z

另有多个单ID单行的宽DataFrame,示例:

ID   New1    New2    New3    ...  New50 
01   01val1  01val2  01val3  ...  01val50

需求:基于ID合并所有DataFrame,生成稀疏矩阵——将子DF的所有新增列加入主DF,不同ID的子DF列名重复时,对应值填入同一列,而非生成New1_x、New1_y这类拆分列。

已尝试的失败方法

  • 方法1:循环执行左合并
    代码:

    master.merge(new_data, on='ID', how='left')
    

    问题:每次合并都会对重复列名生成_x/_y后缀,后续清理成本高且不符合需求。

  • 方法2:基于共同列合并
    代码:

    common = list(master.columns.intersection(new_data.columns))
    master = master.merge(new_data, on=common, how='left')
    

    问题:触发非唯一索引错误,且仅能保留第一个子DF的数据。

正确解决方案

方案1:先合并所有子DF,再与主DF合并

  1. 将所有单ID的子DataFrame合并为一个完整的补充数据集:
    import pandas as pd
    
    # 假设sub_dfs是存储所有子DF的列表
    combined_sub = pd.concat(sub_dfs, ignore_index=True)
    
  2. 以ID为键,将主DF与合并后的补充DF做左合并:
    master = master.merge(combined_sub, on='ID', how='left')
    
    原理:合并后的补充DF中,每个ID对应一行其专属的新增列数据,列名统一;左合并时会自动将这些列匹配到主DF的对应ID行,未覆盖的行填充NaN,完全符合稀疏矩阵需求。

方案2:循环更新主DF(适合子DF数量少的场景)

  1. 先将主DF的ID设为索引,方便匹配:
    master = master.set_index('ID')
    
  2. 遍历每个子DF,设置ID为索引后,用update方法填充对应行的列值:
    for df in sub_dfs:
        sub_df_indexed = df.set_index('ID')
        # 先将主DF中不存在的新增列初始化NaN
        for col in sub_df_indexed.columns:
            if col not in master.columns:
                master[col] = pd.NA
        # 更新对应ID的列值
        master.update(sub_df_indexed)
    
  3. 最后可按需恢复ID为普通列:
    master = master.reset_index()
    
    原理:update会精准匹配索引(ID)和列名,用子DF中的非NaN值替换主DF对应位置的内容,不会生成冗余列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:35:19