Создайте уникальный идентификатор на основе отношения между двумя столбцами - PullRequest
0 голосов
/ 17 февраля 2019

Я работаю с большим набором данных (2M + строки), который выглядит следующим образом:

Id  TeamId  UserId
43  504     722
44  504     727
45  601     300
46  602     722
47  602     727
48  605     300
49  777     300
50  777     301
51  788     400
52  789     400
53  100     727

В этом случае TeamId 504 и 602 совпадают, 601 соответствует 605, но не 777 (потому что в команде есть еще один человек).

Моя цель - создать уникальные идентификаторы для каждой "уникальной" команды:

Id  TeamId  UserId  UniqueId
43  504     722     0
44  504     727     0
45  601     300     1
46  602     722     0
47  602     727     0
48  605     300     1
49  777     300     2
50  777     301     2
51  788     400     3
52  789     400     3
53  100     727     4

Человек может быть в команде из 1, как в случае с UserId 727: он является частьюкоманда 504 (с идентификатором пользователя 722) и команда 100 (одна).Это должно сгенерировать 2 разных уникальных идентификатора для двух команд.

Я не могу groupBy по TeamId только потому, что он будет определять TeamId 504 и 602 как разные команды, и я не могу по UserId, потому что он не будет отслеживать команды.

Насколько я понимаю, это может быть проблема с сетью.Я нашел похожий запрос к этому здесь: Сгруппировать два столбца значения и создать уникальный идентификатор

Как я могу достичь этого?Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Вы можете использовать pivot_table, чтобы войти в индекс TeamId и в столбцы UserId, где каждая строка показывает, какие пользователи входят в каждую команду, например:

dfp = df.pivot_table( values='Id', index='TeamId', columns='UserId', 
                      aggfunc=np.any, fill_value=False)
print (dfp)                            
UserId    300    301    400    722    727
TeamId                                   
100     False  False  False  False   True
504     False  False  False   True   True
601      True  False  False  False  False
602     False  False  False   True   True
605      True  False  False  False  False
777      True   True  False  False  False
788     False  False   True  False  False
789     False  False   True  False  False

Затем, чтобы иметь возможностьполучить уникальный идентификатор, вы можете sort_values по всем столбцам, использовать diff между двумя строками, найти, если any для строк означает различные группы и cumsum, например:

print (dfp.sort_values(dfp.columns.tolist()).diff().any(1).cumsum())
TeamId
100    0
504    1 #same number for 504 and 602 but not 100 as you want
602    1
788    2
789    2
601    3
605    3
777    4
dtype: int64

, такчтобы получить новый столбец, вы можете использовать map:

df['UniqueId'] = df.TeamId.map(dfp.sort_values(dfp.columns.tolist())
                                  .diff().abs().any(1).cumsum())
print (df)
    Id  TeamId  UserId  UniqueId
0   43     504     722         1
1   44     504     727         1
2   45     601     300         3
3   46     602     722         1
4   47     602     727         1
5   48     605     300         3
6   49     777     300         4
7   50     777     301         4
8   51     788     400         2
9   52     789     400         2
10  53     100     727         0
0 голосов
/ 17 февраля 2019

Используйте 2 groupby, чтобы получить результат:

import pandas as pd

df = pd.DataFrame( {'Id'    :[43,44,45,46,47,48,49,50,51,52,53],
                    'TeamId':[504,504,601,602,602,605,777,777,788,789,100],
                    'UserId':[722,727,300,722,727,300,300,301,400,400,727]})

df_grouped = df.groupby('TeamId')['UserId'].apply(tuple).to_frame().reset_index()

df_grouped = df_grouped.groupby('UserId')['TeamId'].apply(tuple).to_frame().reset_index()

print(df_grouped)

результат:

       UserId      TeamId
0      (300,)  (601, 605)
1  (300, 301)      (777,)
2      (400,)  (788, 789)
3  (722, 727)  (504, 602)
4      (727,)      (100,)

просто итерируйте столбец TeamId, чтобы установить номер команды ...

0 голосов
/ 17 февраля 2019

Для каждой строки создайте новую переменную (возможно, кортеж), в которой есть члены этой команды.

Id  TeamId  UserId  NewVar
43  504     722     (722, 727)
44  504     727     (722, 727)
45  601     300     (300)
46  602     722     (722, 727)
47  602     727     (722, 727)
48  605     300     (300)
49  777     300     (300, 301)
50  777     301     (300, 301)
51  788     400     (400)
52  789     400     (400)
53  100     727     (727)

после этого шага сравните NewVar и назначьте идентификатор Ps: не забудьте заказатьNewVar

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...