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合并
- 将所有单ID的子DataFrame合并为一个完整的补充数据集:
import pandas as pd # 假设sub_dfs是存储所有子DF的列表 combined_sub = pd.concat(sub_dfs, ignore_index=True) - 以ID为键,将主DF与合并后的补充DF做左合并:
原理:合并后的补充DF中,每个ID对应一行其专属的新增列数据,列名统一;左合并时会自动将这些列匹配到主DF的对应ID行,未覆盖的行填充NaN,完全符合稀疏矩阵需求。master = master.merge(combined_sub, on='ID', how='left')
方案2:循环更新主DF(适合子DF数量少的场景)
- 先将主DF的ID设为索引,方便匹配:
master = master.set_index('ID') - 遍历每个子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) - 最后可按需恢复ID为普通列:
原理:master = master.reset_index()update会精准匹配索引(ID)和列名,用子DF中的非NaN值替换主DF对应位置的内容,不会生成冗余列。
内容的提问来源于stack exchange,提问作者Zach Champion
相关产品推荐
相关产品推荐

