为何Pandas合并object类型列失败(一列由int转object)
Pandas合并失败的原因及解决逻辑解析
问题重现
执行以下代码后,Pandas合并返回空DataFrame,无法匹配预期的行:
import pandas as pd data1 = {'c1': ['J', 'A', 'B'], 'key': [25, 30, 35]} df1 = pd.DataFrame(data1) data2 = {'c2': ['A', 'B', 'C'], 'key': ["25","30","36"]} df2 = pd.DataFrame(data2, dtype="O") df1.key = df1.key.astype("O") print(df1.merge(df2, on = "key")) # 输出: # Empty DataFrame # Columns: [c1, key, c2] # Index: []
但如果将df1.key先转为字符串再转回object类型,合并就能正常匹配:
df1.key = df1.key.astype(str).astype("O")
原因解析
第一次转换的本质:类型未真正对齐
df1.key.astype("O")只是把列的 dtype 标记为object,但列里的元素仍然是整数类型(比如df1.key[0]的类型是int)。而df2的key列虽然dtype也是object,但元素是字符串类型(df2.key[0]的类型是str)。Pandas的merge操作是严格匹配元素的值+类型的,整数25和字符串"25"在Pandas眼里是完全不同的元素,自然匹配不到。二次转换的作用:统一元素底层类型
astype(str)会把整数真正转换成字符串类型(比如25变成"25"),此时再转回object dtype,列里的元素底层类型已经是字符串了,和df2的key列元素类型、值完全一致,merge时就能正常匹配到对应行。
验证方式
可以通过打印元素类型确认差异:
# 第一次转换后查看元素类型 df1.key = df1.key.astype("O") print(type(df1.key[0])) # 输出:<class 'int'> # 二次转换后查看元素类型 df1.key = df1.key.astype(str).astype("O") print(type(df1.key[0])) # 输出:<class 'str'>
内容的提问来源于stack exchange,提问作者figs_and_nuts
相关产品推荐
相关产品推荐

