Pandas 1.1.5与1.2.0及以上版本merge方法行为差异问题
Pandas 1.2.0+左连接匹配失效问题分析与解决
以下这段左连接代码在Pandas 1.1.5版本可正常执行,但升级到1.2.0及以上版本后,即使关联键DLM存在明确匹配项,也无法正确关联,且无报错提示:
mapping = pd.merge( df_1, df_2, how="left", on=["DLM"] )
示例复现
原始数据
df_1:
| A | DLM |
|---|---|
| 1 | 2 |
| 3 | 4 |
df_2:
| DLM | B |
|---|---|
| 2 | 3 |
不同版本执行结果
- Pandas 1.1.5(正常):
| A | DLM | B |
|---|---|---|
| 1 | 2 | 3 |
| 3 | 4 | NaN |
- Pandas 1.2.0+(异常):
| A | DLM | B |
|---|---|---|
| 1 | 2 | NaN |
| 3 | 4 | NaN |
注:以上为示例数据,非实际生产数据
问题根源
Pandas 1.2.0版本开始,对merge操作的关联键类型匹配逻辑做了严格调整:不再自动隐式转换不同数据类型的关联键。如果两个DataFrame的DLM列数据类型不一致(比如一个是Python原生int,另一个是NumPy的np.int64;或者一个是数值型,另一个是字符串型),即使表面值相同,也会被判定为不匹配。
而Pandas 1.1.5及更早版本会自动尝试隐式转换类型以完成匹配,所以不会出现此问题。
解决方法
核心思路是统一两个DataFrame关联键的数据类型,以下是两种常用方案:
方案1:统一转为相同数值类型
# 统一转为Python原生int(或根据实际需求用np.int64等) df_1['DLM'] = df_1['DLM'].astype(int) df_2['DLM'] = df_2['DLM'].astype(int) # 重新执行merge mapping = pd.merge(df_1, df_2, how="left", on=["DLM"])
方案2:统一转为字符串类型
如果关联键存在混合类型(比如包含数值和字符串),转为字符串更稳妥:
df_1['DLM'] = df_1['DLM'].astype(str) df_2['DLM'] = df_2['DLM'].astype(str) mapping = pd.merge(df_1, df_2, how="left", on=["DLM"])
辅助排查:检查键的类型
可以先打印两列的数据类型,确认是否存在差异:
print(f"df_1['DLM']类型:{df_1['DLM'].dtype}") print(f"df_2['DLM']类型:{df_2['DLM'].dtype}")
验证结果
统一类型后,Pandas 1.2.0+版本的执行结果将和1.1.5版本一致,能够正确匹配关联键。
内容的提问来源于stack exchange,提问作者Deepu Kr
相关产品推荐
相关产品推荐

