Поиск уникальных идентификаторов в строках данных - PullRequest
2 голосов
/ 08 ноября 2019

Ввод - фрейм данных с более чем 50k строк.

Ожидаемый результат: найти уникальные идентификаторы по нескольким столбцам.

Например, есть фрейм данных:

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

Таким образом, логика заключается в том, что если у какой-либо строки есть общий параметр, то естьтот же уникальный идентификатор, результат должен быть примерно таким, сделанным итерациями: сначала пар1:

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

затем пар2:

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

затем пар3:

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

Затем следует проверить, есть ли еще какие-либо заблуждения: например, id=5 и id=3 должны получить uniq_id = 1, потому что -id = 7 is uniq_id = 1 and id = 7 share par1 with id = 5 , and because of that id = 3` также меняется.

Надеюсь, понятно, что я пытаюсь объяснить. На данный момент единственное рабочее решение, созданное мной, - создание multiple for циклов и сравнение значений вручную, но поскольку существует множество наблюдений, выполнение может занять вечность.

1 Ответ

1 голос
/ 08 ноября 2019

Сначала используйте 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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...