输入-具有超过5万行的数据框。
预期结果:通过多列查找唯一的ID。
F.e。有数据框:
id par1 par2 par3
1 a 1 AA
2 b 2 AB
3 c 3 AC
4 a 4 AD
5 d 3 AE
6 e 5 AD
7 d 1 AF
因此,逻辑是,如果任何行共享公共参数(即相同的唯一ID),则结果应该是这样的,由迭代生成: 首先是par1:
id par1 par2 par3 uniq_id
1 a 1 AA 1
2 b 2 AB 2
3 c 3 AC 3
4 a 4 AD 1
5 d 3 AE 4
6 e 5 AD 5
7 d 1 AF 4
然后通过par2:
id par1 par2 par3 uniq_id
1 a 1 AA 1
2 b 2 AB 2
3 c 3 AC 3
4 a 4 AD 1
5 d 3 AE 3
6 e 5 AD 5
7 d 1 AF 1
然后通过par3:
id par1 par2 par3 uniq_id
1 a 1 AA 1
2 b 2 AB 2
3 c 3 AC 3
4 a 4 AD 1
5 d 3 AE 3
6 e 5 AD 1
7 d 1 AF 1
然后应检查是否仍然存在误导:
f.e. id=5
和id=3
应该得到uniq_id = 1
,因为—id = 7 is
uniq_id = 1 and
id = 7 share
par1 {{1} } id = 5 with
id = 3`也会更改。
我希望我能解释清楚。
目前,我唯一可行的解决方案-创建, and because of that
周期并手动比较值,但是由于有很多观察结果,因此可能要花很多时间才能执行。
答案 0 :(得分:1)
首先使用factorize
,然后将Series.map
与DataFrame.drop_duplicates
一起使用:
df['uniq_id'] = pd.factorize(df['par1'])[0] + 1
df['uniq_id'] = df['par2'].map(df.drop_duplicates('par2').set_index('par2')['uniq_id'])
df['uniq_id'] = df['par3'].map(df.drop_duplicates('par3').set_index('par3')['uniq_id'])
print (df)
id par1 par2 par3 uniq_id
0 1 a 1 AA 1
1 2 b 2 AB 2
2 3 c 3 AC 3
3 4 a 4 AD 1
4 5 d 3 AE 3
5 6 e 5 AD 1
6 7 d 1 AF 1
如果可能,可以创建更多列:
df['uniq_id'] = pd.factorize(df['par1'])[0] + 1
for col in ['par2','par3']:
df['uniq_id'] = df[col].map(df.drop_duplicates(col).set_index(col)['uniq_id'])