解决Pandas DataFrame合并后数据丢失、被NaN替代的问题
DataFrame左连接后字段值异常的问题排查与修复
有两个DataFrame(dfone、dftwo),执行以下左连接代码后,部分Train、Online、Home字段出现NaN或错误值,与预期输出不符:
dfthree = pd.merge(dfone, dftwo, left_on='Centre', right_on='Centre', how='left', suffixes=('','_y')).filter(regex='^(?!.*_y)')
原始DataFrame示例
dfone
Centre Name open click 0 12345 Ed 4 7 1 67890 Dave 8 3 2 54321 Mary 5 6 3 09876 Susan 4 3 4 24680 Tom 9 7 5 13579 Will 6 2
dftwo
Centre Name Train Online Home 0 67890 Dave Y Y N 1 13579 Will N Y Y 2 09876 Susan Y Y Y 3 24680 Tom N N Y 4 54321 Mary Y Y N 5 12345 Ed N N N
预期输出与实际输出
预期输出
Centre Name open click Train Online Home 0 12345 Ed 4 7 N N N 1 67890 Dave 8 3 Y Y N 2 54321 Mary 5 6 Y Y N 3 09876 Susan 4 3 Y Y Y 4 24680 Tom 9 7 N N Y 5 13579 Will 6 2 N Y Y
实际输出
Centre Name open click Train Online Home 0 12345 Ed 4 7 N N N 1 67890 Dave 8 3 N N N 2 54321 Mary 5 6 N N N 3 09876 Susan 4 3 NaN NaN NaN 4 24680 Tom 9 7 NaN NaN NaN 5 13579 Will 6 2 NaN NaN NaN
问题原因
核心问题是**Centre字段的数据类型不匹配**:
dfone中的Centre是整数类型(如09876会被解析为整数9876),而dftwo中的Centre是带前导零的字符串类型(如"09876")。- 整数与字符串无法匹配,导致除了
12345这类无前置零的数值外,其他行的连接均失败,进而出现NaN或错误赋值。
修复方案
步骤1:统一Centre字段的数据类型
将两个DataFrame的Centre字段转为相同类型(推荐字符串,保留前置零信息):
dfone['Centre'] = dfone['Centre'].astype(str) dftwo['Centre'] = dftwo['Centre'].astype(str)
步骤2:优化合并逻辑(可选,提升严谨性)
由于Name字段在两个DataFrame中也一一对应,可使用多键连接避免单一键可能的歧义:
# 方式1:统一类型后沿用原逻辑 dfthree = pd.merge(dfone, dftwo, left_on='Centre', right_on='Centre', how='left', suffixes=('','_y')).filter(regex='^(?!.*_y)') # 方式2:多键连接,更严谨 dfthree = pd.merge(dfone, dftwo, on=['Centre', 'Name'], how='left')
执行上述修正后,合并结果将与预期完全一致,所有字段均能正确匹配赋值。
内容的提问来源于stack exchange,提问作者Ed Jefferies
相关产品推荐
相关产品推荐

