首页 > 解决方案 > 在数据框行中查找唯一 ID

问题描述

输入 - 超过 50k 行的数据框。

预期结果:按多列查找唯一 ID。

Fe有数据框:

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

然后应该检查是否仍然有任何误导: fe id=5id=3should get uniq_id = 1,因为 —id=7 isuniq_id=1 andid=7 sharepar1 withid=5 , and because of thatid=3` 也会发生变化。

我希望我试图解释的内容很清楚。目前只有我制作的可行解决方案 -multiple for手动创建循环和比较值,但由于有很多观察,它可能需要很长时间才能执行。

标签: python-3.xpandasnumpygroup-bygrouping

解决方案


先用factorizeSeries.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'])

推荐阅读