pandas merge合并csv与Excel时数值关联列匹配失败如何解决
问题诱因
匹配失败的核心原因是两个待合并DataFrame的gesellschaft列数据类型不统一:
- 从CSV读取的
df1中,gesellschaft列同时存在纯数字值(0、10000)和字符串值(M552D),pandas会默认将该列推断为字符串类型,其中的数字会被存储为字符串格式,如"0"、"10000"。 - 从Excel读取的
df2中,gesellschaft列的纯数字值会被pandas自动识别为数值类型(int或float),仅M552D这类非纯数字内容为字符串类型。 - pandas的
merge操作是严格校验值和数据类型的,数值类型的0和字符串类型的"0"会被判定为不相等,因此只有两边同为字符串类型的M552D可以正常匹配。设置how='right'时其余列丢失,本质是类型不匹配导致左表关联行匹配失败、被填充空值,和merge的连接方向参数本身无关。
解决方案
合并前先统一两个表关联列的数据类型,再执行原有合并逻辑即可:
import pandas as pd df1 = pd.read_csv(r'path', sep=',').drop(columns = ['risiko']) df2 = pd.read_excel(r'path') # 统一关联列为字符串类型,解决类型不匹配问题 df1['gesellschaft'] = df1['gesellschaft'].astype(str) df2['gesellschaft'] = df2['gesellschaft'].astype(str) # 按原有逻辑执行合并 df3 = pd.merge(df1, df2[['status','stati']], on='status', how='left').drop(columns = ['status']) df4 = df3.merge(df2[['sparte','sparten']], on='sparte', how='left').drop(columns = ['sparte']) df4 = df4.merge(df2[['gesellschaft','gesellschaften']], on='gesellschaft', how='left') print(df4)
如果读取Excel时gesellschaft列的数字被识别为浮点型(比如0被识别为0.0),直接转字符串会得到"0.0"这类值,和CSV侧转成的"0"仍然无法匹配,可追加一步字符串清洗,去除末尾的.0后缀:
# 处理浮点转字符串带来的.0后缀问题 df1['gesellschaft'] = df1['gesellschaft'].astype(str).str.replace(r'\.0$', '', regex=True) df2['gesellschaft'] = df2['gesellschaft'].astype(str).str.replace(r'\.0$', '', regex=True)
内容的提问来源于stack exchange,提问作者Anthony Admin
相关产品推荐
相关产品推荐

