为何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
相关产品推荐
相关产品推荐

