Python Pandas数据框连接问题:无法得到预期结果求助
问题分析与解决
问题描述
我有表A和表B,想要连接得到表C,尝试了以下代码但未得到预期结果:
C = pd.merge(A, B, how = 'inner', left_on = ['ID1', 'ID2', 'ID3'], right_on = ['IDA', 'IDB', 'IDC'])
表A数据
| ID1 | ID2 | ID3 | Color | Flag |
|---|---|---|---|---|
| A | 1 | 1 | 白色 | Y |
| B | 1 | 2 | 黑色 | Y |
| A | 1 | 3 | 绿色 | N |
| E | 2 | 3 | 蓝色 | Y |
| D | 4 | 5 | 蓝色 | N |
| C | 6 | 7 | 红色 | N |
| F | 9 | 7 | 黑色 | Y |
表B数据
| IDA | IDB | IDC |
|---|---|---|
| A | 1 | 1 |
| F | 9 | 7 |
| A | 1 | 3 |
| D | 4 | 5 |
预期表C数据
| ID1 | ID2 | ID3 | Color | Flag |
|---|---|---|---|---|
| A | 1 | 1 | 白色 | Y |
| A | 1 | 3 | 绿色 | N |
| D | 4 | 5 | 蓝色 | N |
| F | 9 | 7 | 黑色 | Y |
问题原因与解决方法
你的代码逻辑方向正确,但执行后会保留表B的IDA、IDB、IDC列,和预期表C的结构不符。另外要确保两个表中用于连接的列数据类型完全一致(比如表A的ID2、ID3是数值型,表B的IDB、IDC也要是数值型,否则会匹配失败)。
修正方案1:合并后删除冗余列
执行合并后,删除表B带来的重复ID列:
C = pd.merge(A, B, how='inner', left_on=['ID1', 'ID2', 'ID3'], right_on=['IDA', 'IDB', 'IDC']) # 删除表B的ID列 C = C.drop(columns=['IDA', 'IDB', 'IDC'])
修正方案2:先重命名表B的列再合并
先把表B的列名改成和表A一致,再合并,避免生成冗余列:
# 重命名表B的列 B_renamed = B.rename(columns={'IDA': 'ID1', 'IDB': 'ID2', 'IDC': 'ID3'}) # 按相同列名合并 C = pd.merge(A, B_renamed, how='inner', on=['ID1', 'ID2', 'ID3'])
额外检查点
如果合并后结果行数不对,检查:
- 两个表中连接列的数据类型是否一致(可通过
A.dtypes和B.dtypes查看) - 是否存在空格或隐藏字符(比如ID列的字符串前后有空格,可先用
str.strip()处理)
内容的提问来源于stack exchange,提问作者NEWBIE
相关产品推荐
相关产品推荐

