这是我的设置:
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
答案 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)