在没有 drop_duplicates 的情况下删除重复的 Pandas

Posted

技术标签:

【中文标题】在没有 drop_duplicates 的情况下删除重复的 Pandas【英文标题】:Removing duplicates Pandas without drop_duplicates 【发布时间】:2022-01-12 21:28:20 【问题描述】:

请注意,在转向您之前,我已经浏览了各种帖子。 事实上,我尝试实现中提供的解决方案:dropping rows from dataframe based on a "not in" condition

我的问题如下。假设我有一个巨大的数据框,我想删除其中的重复项。我很清楚我可以使用 drop_duplicates 因为它是最快的最简单的方法。但是,我们的老师希望我们创建一个包含重复项 ID 的列表,然后根据这些值是否包含在上述列表中来删除它们。

#My list
list1 = ['s1' , 's2']
print(len(list1))
#My dataframe
data1 = pd.DataFrame(data='id':['s1' , 's2', 's3', 's4', 's5' , 's6'])
print(len(data1))
#Remove all the rows that hold a value contained in list1 matched against the 'id' column
data2 = data1[~data1.id.isin(list1)]
print(len(data2))

现在,让我们看看输出:

Len list1 = 135
Len data1 = 8942
Len data2 = 8672

所以,我得出的结论是,我的代码以某种方式将要删除的行加倍并删除它们。

但是,当我采用 drop_duplicates 方法时,我的代码可以正常工作并删除 135 行。

谁能帮我理解为什么会这样?我试图尽可能简化问题。

非常感谢!

【问题讨论】:

8942 - 8672 = 270 = 135 * 2 嗯.... 也许list1中的每个id都有两行? 请注意,您也可以像这样删除行:data1.set_index('id').drop(list1).reset_index() 非常感谢,我检查了前50行,实际上有2-3行具有相同的id。话虽这么说,有没有办法限制最多 1 个样本的去除? 【参考方案1】:

这是一种非常痛苦的方式来做你所要求的。也许有人会看到这一点,并采取一种不那么痛苦的方式。我特别远离groupby('id').first() 作为删除重复项的手段,因为您提到需要首先创建一个重复项列表。但这将是我的下一个最佳建议。

无论如何,我在您的示例中添加了 s1 和 s2 的副本

df = pd.DataFrame(data='id':['s1' , 's2', 's3', 's4', 's5' , 's6', 's1' , 's2', 's2'])

查找具有超过 1 个条目的 ID(假设重复)。在这里,我确实使用 groupby 来获取计数并保持 >1 并将唯一值发送到 a 列表

dup_list = df[df.groupby('id')['id'].transform('count') > 1]['id'].unique().tolist()
print(dup_list)

['s1', 's2']

然后遍历列表查找重复的索引并删除除第一个以外的所有索引

for id in dup_list:
    # print(df[df['id']==id].index[1:].to_list())
    drp = df[df['id']==id].index[1:].to_list()
    df.drop(drp, inplace=True)
df

   id
0  s1
1  s2
2  s3
3  s4
4  s5
5  s6

索引 6 和 7 已删除

【讨论】:

以上是关于在没有 drop_duplicates 的情况下删除重复的 Pandas的主要内容,如果未能解决你的问题,请参考以下文章

mkdir命令怎么用啊?我在XP系统DOS下建个文件夹(f:\nothing..\),我现在要在win7下删了!

pandas.DataFrame.drop_duplicates 用法说明

python用drop_duplicates()函数保留数据集的重复行

pandas.DataFrame.drop_duplicates

Pandas drop_duplicates 方法不适用于包含列表的数据框

col.drop_duplicates() 有更快的替代方法吗?