您如何在熊猫数据框中找到并标记重复项?

时间:2020-09-11 06:01:30

标签: python pandas dataframe duplicates

这是我的设置:

import pandas as pd
import uuid

data = {'col1': ['val1','val1','val1','val2','val2', 'val3'],
        'col2': ['val4','val4','val4','val5','val5', 'val5']
        }
df = pd.DataFrame(data)
print (df)

>    col1  col2
> 0  val1  val4
> 1  val1  val4
> 2  val1  val4
> 3  val2  val5
> 4  val2  val5
> 5  val3  val5

我想识别唯一值,并用UUID标记它们。我尝试了以下方法: 我向所有记录添加了UUID。

# add UUID
df["UUID"] = df.apply(lambda x: uuid.uuid4(),axis=1,)
print (df)

>    col1  col2                                  UUID
> 0  val1  val4  3670f6c5-03f7-4f6a-ac3e-1075f6131ca3
> 1  val1  val4  aa21f1e0-7c68-4778-aaf4-4d18ad05c65a
> 2  val1  val4  ce5dc0d8-4f1a-412f-8f7f-6176bc62038b
> 3  val2  val5  05010229-7ec3-421f-87a1-defc9483c794
> 4  val2  val5  8dc9244d-eec4-42ef-8e9d-015a661d8418
> 5  val3  val5  8950f30a-5eff-457d-b5ed-1d7a94e9b4b0

我过滤掉重复的值

# get duplicated records
mask=df.duplicated(subset=['col1', 'col2'], keep=False)
df_duplicated=df[mask]
print(df_duplicated)

>    col1  col2                                  UUID
> 0  val1  val4  3670f6c5-03f7-4f6a-ac3e-1075f6131ca3
> 1  val1  val4  aa21f1e0-7c68-4778-aaf4-4d18ad05c65a
> 2  val1  val4  ce5dc0d8-4f1a-412f-8f7f-6176bc62038b
> 3  val2  val5  05010229-7ec3-421f-87a1-defc9483c794
> 4  val2  val5  8dc9244d-eec4-42ef-8e9d-015a661d8418

不幸的是,此时我的幻想已经离开了我。我想采用以下形式(无论哪个UUID连接重复项,都一样是很重要的):

>    col1  col2                                  UUID
> 0  val1  val4  3670f6c5-03f7-4f6a-ac3e-1075f6131ca3
> 1  val1  val4  3670f6c5-03f7-4f6a-ac3e-1075f6131ca3
> 2  val1  val4  3670f6c5-03f7-4f6a-ac3e-1075f6131ca3
> 3  val2  val5  05010229-7ec3-421f-87a1-defc9483c794
> 4  val2  val5  05010229-7ec3-421f-87a1-defc9483c794
> 5  val3  val5  8950f30a-5eff-457d-b5ed-1d7a94e9b4b0

我感谢所有想法。在最好的情况下,我们将采用高效的程序,因为我必须将其应用于大型数据集。 :-)

最佳P

1 个答案:

答案 0 :(得分:2)

一个想法是根据DataFrame的长度(增加10%的大小)生成uuid并删除可能的重复项,然后按GroupBy.ngroup映射组:

s = (pd.Series(uuid.uuid4() for x in range(int(len(df) * 1.1)))
       .drop_duplicates()
       .reset_index(drop=True))
df["UUID"] = df.groupby(['col1', 'col2']).ngroup().map(s)
print (df)

   col1  col2                                  UUID
0  val1  val4  604aedba-9c4e-405c-8d21-fe49749f5ccb
1  val1  val4  604aedba-9c4e-405c-8d21-fe49749f5ccb
2  val1  val4  604aedba-9c4e-405c-8d21-fe49749f5ccb
3  val2  val5  21c202bb-c8db-47bf-9496-04c7794046bc
4  val2  val5  21c202bb-c8db-47bf-9496-04c7794046bc
5  val3  val5  790577c4-eedf-4caa-8f63-e34a5d3b0d8f

如果没有必要使用较小的DataFrame并删除重复对象,则应简化解决方案:

s = pd.Series([uuid.uuid4() for x in range(len(df))])
df["UUID"] = df.groupby(['col1', 'col2']).ngroup().map(s)
相关问题