You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:57:38