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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:55:13