pandas drop_duplicates无法删除同值重复记录问题求助
问题原因
你遇到的核心问题是类型匹配不彻底:DF1的列是object类型,但实际存储的是字符串(比如'40');而DF2通过astype(DF1.dtypes.to_dict())转换后,列虽然是object类型,但存储的是整数(比如40)。两者表面值相同,但底层类型不同,drop_duplicates会将它们判定为不同的记录,所以无法去重。
解决方法
方法1:精准匹配DF1的元素类型
不要直接按列的dtype转换,而是按DF1对应列中元素的实际类型来转换DF2:
# 遍历每一列,将DF2的列转换为DF1对应列第一个元素的类型 DF2 = DF2.apply(lambda col: col.astype(type(DF1[col.name].iloc[0]))) # 合并后去重 DF1 = pd.concat([DF1, DF2]).drop_duplicates(subset=DF1.columns, keep='last')
这种方式不管DF1的object列存的是字符串、数值还是其他类型,都能让DF2的元素类型完全对齐。
方法2:统一转换为可兼容的通用类型
如果你的数据以数值为主,但允许存在字符串格式的数值,可以将两个DataFrame的列统一转换为字符串类型(这是更通用的兜底方案):
DF1 = DF1.astype(str) DF2 = DF2.astype(str) DF1 = pd.concat([DF1, DF2]).drop_duplicates(subset=DF1.columns, keep='last')
方法3:优先转换为数值类型(如果数据允许)
如果所有数据都可以转换为数值(包括空值),可以将两个DataFrame的列统一转换为Int64(支持空值的整数类型),这样既保留数值特性,又能正确去重:
DF1 = DF1.apply(pd.to_numeric, errors='coerce').astype('Int64') DF2 = DF2.astype('Int64') DF1 = pd.concat([DF1, DF2]).drop_duplicates(subset=DF1.columns, keep='last')
注意:errors='coerce'会将无法转换为数值的内容转为NaN,如果你的数据中有非数值字符串,需要谨慎使用。
内容的提问来源于stack exchange,提问作者Jay Patel
相关产品推荐
相关产品推荐

