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

为何pandas.DataFrame.merge返回的DataFrame列类型与输入不一致?

Pandas左连接后整数列转浮点的根本原因

问题场景

使用pandas.DataFrame.merge执行左连接操作时,出现了类型变化现象:左表中存在无法匹配右表的行时,右表的整数列(如示例中的a2、d)会从int64转为float64;但如果移除左表中无法匹配的行,这些列的类型又能保持int64。

示例代码如下:

import pandas as pd

# 创建并查看第一个DataFrame
df1 = pd.DataFrame({'a1': [0, 0, 1, 1, 2],
                    'b': [0, 0, 1, 1, 1],
                    'c': [11, 8, 10, 6, 6]})

print(df1)
print(df1.dtypes)
print()

# 创建并查看第二个DataFrame
df2 = pd.DataFrame({'a2': [0, 1, 1, 1, 3],
                    'b': [0, 0, 0, 1, 1],
                    'd': [22, 24, 25, 33, 37]})
print(df2)
print(df2.dtypes)
print()

# 执行左连接
df_merge = pd.merge(df1, df2, how='left', left_on=['a1', 'b'], right_on=['a2', 'b'])
print(df_merge)
print(df_merge.dtypes)

根本原因

核心原因很直接:pandas的int64类型无法存储缺失值(NaN)。

左连接的逻辑是保留左表的所有行,对于左表中找不到右表匹配项的行,右表对应的列会被填充为NaN。为了容纳这些NaN,pandas会自动将原本的整数列类型升级为float64——因为浮点类型支持存储NaN值。

而当你移除左表中无法匹配的行后,右表的对应列不再有NaN值,pandas就不需要进行类型升级,自然能保持原有的int64类型。

内容的提问来源于stack exchange,提问作者bgoodr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:17:36