Pandas按concat_python左合并DataFrame遇行数膨胀、列重复问题求助
解决DataFrame合并行数膨胀&列重复问题
问题原因
- 行数暴增:你的
concat_python列在两个DataFrame里不是唯一值,left join时每个匹配的重复ID会生成笛卡尔积,导致行数剧增。 - 列重复带后缀:两个DataFrame存在同名列(除了
concat_python),merge时自动添加_x/_y区分。
分步解决方案
1. 先清理重复的唯一标识
首先检查并去除concat_python的重复值,确保每个ID只对应一行:
# 查看重复数量 print("main_file重复ID数:", main_file['concat_python'].duplicated().sum()) print("new_file重复ID数:", new_file['concat_python'].duplicated().sum()) # 去重,保留每个ID的第一行(根据需求可改keep='last'或自定义聚合) main_file = main_file.drop_duplicates(subset='concat_python', keep='first') new_file = new_file.drop_duplicates(subset='concat_python', keep='first')
2. 合并时只保留需要补充的列
过滤new_file,只保留main_file没有的列,避免列重复:
# 筛选new_file中main_file没有的列(排除合并键) supplement_cols = [col for col in new_file.columns if col not in main_file.columns] new_file_supplement = new_file[['concat_python'] + supplement_cols]
3. 合并并补充新行
有两种简洁的实现方式:
方式一:merge + concat(直观可控)
# 先合并补充列到main_file merged = main_file.merge(new_file_supplement, on='concat_python', how='left') # 提取new_file中独有的ID行,补充到结果里 new_unique_rows = new_file[~new_file['concat_python'].isin(main_file['concat_python'])] final_df = pd.concat([merged, new_unique_rows], ignore_index=True)
方式二:combine_first(更简洁的原生方法)
这个方法直接以main_file为基础,自动填充缺失值、补充新列和新行,无需手动处理列重复:
# 先将合并键设为索引 main_file_idx = main_file.set_index('concat_python') new_file_idx = new_file.set_index('concat_python') # 执行合并,自动补充内容 final_df = main_file_idx.combine_first(new_file_idx).reset_index()
验证结果
合并后可以检查行数和列数:
print("最终行数:", len(final_df)) print("最终列数:", len(final_df.columns)) # 确认没有重复ID print("最终重复ID数:", final_df['concat_python'].duplicated().sum())
内容的提问来源于stack exchange,提问作者Chronicles
相关产品推荐
相关产品推荐

