【问题标题】:Finding unique ids in lines of dataframe在数据框行中查找唯一 ID
【发布时间】:2020-03-05 01:18:25
【问题描述】:

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

预期结果:按多列查找唯一 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=5id=3 应该得到 uniq_id = 1,因为 —id=7isuniq_id=1andid=7sharepar1withid=5, and because of thatid=3` 也会发生变化。

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

【问题讨论】:

  • 对于par3par1par2 的逻辑不同?
  • 它必须是相同的逻辑。
  • 好的,我的解决方案适用于par3,就像您需要的那样?
  • 它正确分解。但问题是如何通过组合前一列中的每个唯一值来创建另一个唯一列。
  • 我的答案已被编辑。

标签: python-3.x pandas numpy group-by grouping


【解决方案1】:

首先使用factorize,然后使用Series.mapDataFrame.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'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多