Pandas Duplicated返回一些不重复的值?

hzbexzde  于 2023-03-16  发布在  其他
关注(0)|答案(2)|浏览(152)

我正在尝试从数据集中删除重复项。
在使用df.drop_duplicates()之前,我运行了df[df.duplicated()]来检查哪些值被视为重复值。我认为不重复的值将被返回,见下面的示例。所有列都被检查。
如何获得准确的重复结果并删除真实的的重复?
city price year manufacturer cylinders fuel odometer whistler 26880 2016.0 chrysler NaN gas 49000.0 whistler 17990 2010.0 toyota NaN hybrid 117000.0 whistler 15890 2010.0 audi NaN gas 188000.0 whistler 8800 2007.0 nissan NaN gas 163000.0

p1iqtdky

p1iqtdky1#

遇到了同样的问题。
一开始看起来

df.duplicated(subset='my_column_of_interest')

返回在 my_column_of_interest 字段中实际具有唯一值的结果。
但实际情况并非如此,documentation显示 duplicated 使用 keep 参数选择保留所有副本,仅保留第一个副本或仅保留最后一个副本,其默认值为 first
这意味着,如果某个值在该列中出现两次,则运行df.duplicated(subset='my_column_of_interest ')将返回只包含该值一次的结果(因为只保留其第一次出现)。

bf1o4zei

bf1o4zei2#

我也遇到过同样的问题,在网上找不到一个明确的解决方案,所以下面是对我有效的方法。在阅读了@Mihaela提到的.duplicated的默认值后(),我能够找出我做错了什么。我想要的(我假设您希望)返回 * 所有 * 重复的行,这样您就可以手动验证它们实际上是重复的。.duplicated()对于每组重复项只返回 * 一行 *。如果要返回具有重复值的 * 所有行 *,则必须设置keep=False

对于每组重复行,* 仅返回一行 *:

df[df.duplicated()]

输出示例:
| 识别号|日期|价值|
| - ------|- ------|- ------|
| 1个|三月一日|三十五|
| 第二章|三月一日|二十七|
| 三个|三月一日|八十九|

返回 * 所有 * 重复行:

df[df.duplicated(keep=False)]

输出示例:
| 识别号|日期|价值|
| - ------|- ------|- ------|
| 1个|三月一日|三十五|
| 1个|三月一日|三十五|
| 第二章|三月一日|二十七|
| 第二章|三月一日|二十七|
| 三个|三月一日|八十九|
| 三个|三月一日|八十九|

额外提示

如果您的 Dataframe 尚未排序,则返回的结果将是混合的,因此很难看出这些行实际上是重复的(我也遇到过)。链接**sort_values()到代码的末尾,这样我就可以一起查看重复行的集合,这使得手动验证它们是否相同变得更加容易。只需将by=['col']**参数设置为适合您的用例的列即可。
示例输出(未排序):
| 识别号|日期|价值|
| - ------|- ------|- ------|
| 1个|三月一日|三十五|
| 1个|3/2|三十七|
| 第二章|3/2|四十|
| 三个|三月一日|八十九|
| 第二章|三月一日|二十七|
| 三个|三月一日|八十九|
| 第二章|3/2|四十|
| 1个|三月一日|三十五|
| 第二章|三月一日|二十七|
| 1个|3/2|三十七|
代码:

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

示例输出(排序):
| 识别号|日期|价值|
| - ------|- ------|- ------|
| 1个|三月一日|三十五|
| 1个|三月一日|三十五|
| 1个|3/2|三十七|
| 1个|3/2|三十七|
| 第二章|三月一日|二十七|
| 第二章|三月一日|二十七|
| 第二章|3/2|四十|
| 第二章|3/2|四十|
| 三个|三月一日|八十九|
| 三个|三月一日|八十九|

相关问题