Pandas的Duplicated方法返回一些非重复值?

4

我正在尝试从数据集中删除重复项。

在使用df.drop_duplicates()之前,我先运行df[df.duplicated()]来检查哪些值被视为重复项。返回了我不认为是重复的值,如下例所示。所有列都经过了检查。

如何获取准确的重复结果并删除真正的重复项?

城市 价格 年份 制造商 气缸数 燃料 里程表读数 惠斯勒 26880 2016.0 克莱斯勒 NaN 汽油 49000.0 惠斯勒 17990 2010.0 丰田 NaN 混合动力 117000.0 惠斯勒 15890 2010.0 奥迪 NaN 汽油 188000.0 惠斯勒 8800 2007.0 尼桑 NaN 汽油 163000.0


你可以在 df.drop_duplicates() 中使用 subset 选项。在那里,你可以指定应该考虑哪些列来查找重复项。我相信还有其他的问题展示了如何完成这个操作。 - moys
城市和圆柱体是重复的值,不是吗? - Daemon Painter
1
@ValdemarT - 你解决了这个问题吗?有什么进展吗?我也遇到了使用drop_duplicates()时的同样问题。你的意见将非常有帮助。 - The Great
我有完全相同的问题。一些列是重复的,但是其他连续数据类型列不重复。但整行仍被视为重复。 - The Great
也遇到了同样的问题。 df.drop_duplicates(subset='my_column_of_interest') 返回在 my_column_of_interest 字段中具有唯一值的结果。 - Mihaela Grigore
显示剩余2条评论
2个回答

1

我遇到了同样的问题。

起初,看起来像是

df.duplicated(subset='my_column_of_interest') 

返回实际具有my_column_of_interest字段中唯一值的结果。

然而,事实并非如此。文档显示,duplicated使用keep参数选择保留所有重复项、仅保留第一个或最后一个。其默认值为first

这意味着,如果在该列中存在两次相同的值,则运行df.duplicated(subset='my_column_of_interest')将返回仅包含此值一次的结果(因为只保留了它的第一次出现)。


1
我曾经遇到同样的问题,在网上找不到清晰的解决方案,所以这里是我找到的解决方法。在阅读了@Mihaela提到的.duplicated()的默认值后,我能够弄清楚我的错误之处。我想要的(并且我认为你也想要的)是返回所有重复行,以便您可以手动验证它们是否确实是重复的。默认情况下,.duplicated()只会为每组重复项返回一行。如果您想返回具有重复值的所有行,则必须设置keep=False

仅返回每组重复行中的一行

df[df.duplicated()]

示例输出:

ID 日期 数值
1 3/1 35
2 3/1 27
3 3/1 89

返回所有重复的行:

df[df.duplicated(keep=False)]

示例输出:

ID 日期 数值
1 3/1 35
1 3/1 35
2 3/1 27
2 3/1 27
3 3/1 89
3 3/1 89

附加提示

如果您的数据框尚未排序,则结果将以混合的方式返回,很难看出行实际上是重复的(这种情况发生在我身上)。在代码末尾链接 sort_values() 可以让我查看一组重复行,使手动验证它们是否相同变得更加容易。只需设置 by=['col'] 参数为您的用例中有意义的列。

示例输出(未排序):

ID 日期 数值
1 3/1 35
1 3/2 37
2 3/2 40
3 3/1 89
2 3/1 27
3 3/1 89
2 3/2 40
1 3/1 35
2 3/1 27
1 3/2 37

代码:

df[df.duplicated(keep=False)].sort_values(by=['id', 'date'])

示例输出(已排序):

ID 日期 数值
1 3/1 35
1 3/1 35
1 3/2 37
1 3/2 37
2 3/1 27
2 3/1 27
2 3/2 40
2 3/2 40
3 3/1 89
3 3/1 89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接