Возможность Groupby в Pandas для сопоставления между группами - PullRequest
1 голос
/ 06 мая 2019

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

Пример того, как выглядит DataFrame:

d = {"person": [1,2,3,4,5,6,1,5,2,1,7],
     "group":  [1,1,1,2,2,2,3,3,3,4,4]}

df = pd.DataFrame(d)

print(d)

    person  group
0   1       1
1   2       1
2   3       1
3   4       2
4   5       2
5   6       2
6   1       3
7   5       3
8   2       3
9   1       4
10  7       4

(Рабочий) код в настоящее время выглядит следующим образом:

for g in df.group.unique():

    df_g = df.loc[df.group == g]

    for p in df_g.person.unique():

        print(df.loc[df.person == p].group.unique()) # <-- the thing I care about.


[1 3 4]
[1 3]
[1]
[2]
[2 3]
[2]
[1 3 4]
[2 3]
[1 3]
[1 3 4]
[4]

Как уже говорилось, приведенный выше код очень медленный (он должен проходить через множество групп и даже больше людей).Можно ли будет выполнить ту же операцию через групповую передачу?

Ответы [ 3 ]

3 голосов
/ 06 мая 2019

Используйте GroupBy.transform с SeriesGroupBy.unique для нового столбца, заполненного уникальными значениями:

df['new'] = df.groupby('person')['group'].transform('unique')
print (df)
    person  group        new
0        1      1  [1, 3, 4]
1        2      1     [1, 3]
2        3      1        [1]
3        4      2        [2]
4        5      2     [2, 3]
5        6      2        [2]
6        1      3  [1, 3, 4]
7        5      3     [2, 3]
8        2      3     [1, 3]
9        1      4  [1, 3, 4]
10       7      4        [4]
1 голос
/ 06 мая 2019

Попробуйте:

df['all_groups'] = df.groupby('person').group.transform('unique')
1 голос
/ 06 мая 2019

Использование unique с reindex(df.person)

df.groupby('person')['group'].unique().reindex(df.person)
Out[1410]: 
person
1    [1, 3, 4]
2       [1, 3]
3          [1]
4          [2]
5       [2, 3]
6          [2]
1    [1, 3, 4]
5       [2, 3]
2       [1, 3]
1    [1, 3, 4]
7          [4]
Name: group, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...