pandas合并两个DataFrame报错但关联列均为object是什么原因
报错根因与解决方法
1. 最常见原因:join方法的参数逻辑理解偏差
pandas的join方法默认是左表列匹配右表索引,你传入的on="foo"仅指定使用df1的foo列作为连接键,去匹配df2的行索引,而非匹配df2的foo列。
你之前检查的是df2的foo列类型,没有关注df2的索引类型,只要df2的索引是int64类型,就会触发类型不匹配报错。
如果需要按两个表的foo列合并,推荐直接改用merge方法,语法更直观:
df1.merge(df2, how = 'left', on = "foo")
如果要坚持用join,需要提前把df2的索引设置为foo列:
df2.set_index("foo", inplace=True) res = df1.join(df2, how = 'left', on = "foo")
2. 次要原因:object类型内部存在隐性类型差异
如果确认你的使用场景就是要匹配df1的foo列与df2的索引,且df2索引也显示为object类型,那需要排查元素的实际类型:
dtype标记为object仅代表该列/索引不属于pandas原生的固定类型,内部可以混合存储字符串、整数、浮点数等任意Python对象。即使两边dtype对比返回True,只要一侧的实际元素以整数为主、另一侧以字符串为主,pandas的类型校验仍会触发报错。
可以执行以下代码排查实际元素类型:
# 查看df1的foo列元素类型分布 print(df1["foo"].apply(type).value_counts()) # 查看df2索引的元素类型分布 print(df2.index.to_series().apply(type).value_counts())
确认类型差异后,统一转换为相同类型即可,比如统一转字符串:
df1["foo"] = df1["foo"].astype(str) df2.index = df2.index.astype(str)
内容的提问来源于stack exchange,提问作者four-eyes
相关产品推荐
相关产品推荐

