在没有 drop_duplicates 的情况下删除重复项 Pandas
Removing duplicates Pandas without drop_duplicates
请注意,在向您求助之前,我已经浏览了各种帖子。
事实上,我试图实施中提供的解决方案:
我的问题如下。假设我有一个巨大的数据框,我想删除其中的重复项。我很清楚我可以使用 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 行。
你们能帮我理解为什么会这样吗?我尽量简化了问题。
非常感谢!
按照您的要求,这是一种非常痛苦的方式。也许有人会看到这一点并采取不那么痛苦的方式。我特别远离 groupby('id').first()
作为删除重复项的方法,因为您提到需要首先创建重复项列表。但这将是我的下一个最佳建议。
无论如何,我在你的示例中添加了 s1 和 s2 的副本
df = pd.DataFrame(data={'id':['s1' , 's2', 's3', 's4', 's5' , 's6', 's1' , 's2', 's2']})
查找包含超过 1 个条目的 ID(假设重复)。在这里我确实使用 groupby 来获取计数并保持那些 >1 并将唯一值发送到列表
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 因为它是最快最简单的方法。但是,我们的老师希望我们创建一个包含重复 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 行。
你们能帮我理解为什么会这样吗?我尽量简化了问题。
非常感谢!
按照您的要求,这是一种非常痛苦的方式。也许有人会看到这一点并采取不那么痛苦的方式。我特别远离 groupby('id').first()
作为删除重复项的方法,因为您提到需要首先创建重复项列表。但这将是我的下一个最佳建议。
无论如何,我在你的示例中添加了 s1 和 s2 的副本
df = pd.DataFrame(data={'id':['s1' , 's2', 's3', 's4', 's5' , 's6', 's1' , 's2', 's2']})
查找包含超过 1 个条目的 ID(假设重复)。在这里我确实使用 groupby 来获取计数并保持那些 >1 并将唯一值发送到列表
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 已删除