Python合并DataFrame异常:非唯一关联键导致结果不符预期
解决DataFrame左合并后仅第一行匹配的问题
先排查键的匹配性
首先确认两个DataFrame的关联键(Product_Type和Product_Colour)内容完全一致,常见隐性不匹配原因及处理方式:
- 空格/不可见字符:比如df1的
Product_Type末尾带空格,df2的不带,导致匹配失败。清理代码:df1[['Product_Type', 'Product_Colour']] = df1[['Product_Type', 'Product_Colour']].apply(lambda x: x.str.strip()) df2[['Product_Type', 'Product_Colour']] = df2[['Product_Type', 'Product_Colour']].apply(lambda x: x.str.strip()) - 大小写差异:比如df1是
'shirt',df2是'Shirt',统一大小写:df1[['Product_Type', 'Product_Colour']] = df1[['Product_Type', 'Product_Colour']].apply(lambda x: x.str.lower()) df2[['Product_Type', 'Product_Colour']] = df2[['Product_Type', 'Product_Colour']].apply(lambda x: x.str.lower())
对df2去重后再合并
如果df2中同一组关联键对应多条Code=KI的记录,先去重保留唯一映射关系,避免无效笛卡尔积,同时保证所有df1行都能匹配到Code:
# 按关联键去重,保留第一条有效记录 df2_unique = df2.drop_duplicates(subset=['Product_Type', 'Product_Colour'], keep='first') df3 = pd.merge(df1, df2_unique, on=['Product_Type','Product_Colour'], how='left')
直接映射赋值(替代merge的方案)
如果明确关联键对应的Code是固定值,也可以直接通过映射给df1新增Code列:
# 提取键与Code的唯一映射 code_map = df2.drop_duplicates(subset=['Product_Type', 'Product_Colour']).set_index(['Product_Type', 'Product_Colour'])['Code'] # 给df1赋值 df1['Code'] = df1.set_index(['Product_Type', 'Product_Colour']).index.map(code_map) df3 = df1.copy()
验证示例
完整可运行的示例代码:
import pandas as pd # 构造测试df1 df1 = pd.DataFrame({ 'Product_Type': ['Shirt', 'Shirt', 'Shirt'], 'Product_Colour': ['Black', 'Black', 'Black'], 'Details': ['S', 'M', 'L'] }) # 构造测试df2(含多条相同键的记录) df2 = pd.DataFrame({ 'Product_Type': ['Shirt', 'Shirt', 'Pants'], 'Product_Colour': ['Black', 'Black', 'Blue'], 'Code': ['KI', 'KI', 'KJ'] }) # 执行合并 df2_unique = df2.drop_duplicates(subset=['Product_Type', 'Product_Colour']) df3 = pd.merge(df1, df2_unique, on=['Product_Type','Product_Colour'], how='left') print(df3)
输出结果:
Product_Type Product_Colour Details Code 0 Shirt Black S KI 1 Shirt Black M KI 2 Shirt Black L KI
内容的提问来源于stack exchange,提问作者beginner
相关产品推荐
相关产品推荐

