如何合并两个均含重复行的Pandas DataFrame且保留df1全量行
Pandas多表合并行数超预期问题解决方案
核心原因排查
合并后行数超出预期通常由两类错误导致:
- 未为
drop_duplicates指定subset参数,默认按整行去重而非按关联列Name去重,去重后的df2仍存在Name重复值,合并时触发笛卡尔积,1行df1匹配多行df2就会导致行数暴涨 - 关联列
Name存在隐形字符(首尾空格、大小写差异、特殊不可见符号),视觉上是相同值实际底层存储为不同值,导致去重不彻底
解决步骤
- 首先调整合并逻辑,如果你需要完整保留df1的所有行,必须指定左连接参数
how='left',默认merge是内连接,会丢失df1中Name不在df2的行,不符合你的需求 - 对两个表的关联列做统一清洗,消除隐形字符干扰:
# 统一清洗Name列,去除首尾空格、统一转为大写(可根据你的业务场景调整规则) df1['Name'] = df1['Name'].str.strip().str.upper() df2['Name'] = df2['Name'].str.strip().str.upper()
- 对df2按关联列明确去重,去重后验证唯一性:
# 指定subset参数按Name列去重,keep='first'为保留第一条出现的记录,可按需调整为'last' df2_unique = df2.drop_duplicates(subset='Name', keep='first') # 验证去重后Name列是否完全唯一,输出为0代表无重复,符合要求 print(df2_unique['Name'].duplicated().sum())
- 执行左连接合并,验证结果行数:
dfn = df1.merge(df2_unique, on='Name', how='left') # 正常情况下输出为True,说明完整保留了df1的所有行,无多余匹配 print(len(dfn) == len(df1))
特殊场景说明
如果你的实际业务关联键不止Name一列,需要将所有关联列同步加入subset、on参数中,避免单键匹配导致的笛卡尔积问题。
内容的提问来源于stack exchange,提问作者Mr.B
相关产品推荐
相关产品推荐

