Как получить пропорцию каждого значения тега, соответствующего каждому `user_id` - PullRequest
1 голос
/ 26 июня 2019

Я получаю кадр данных следующим образом:

    user_id label
0   937922  1
1   937922  2
2   937922  2
3   937922  2
4   1369473 1
5   1330642 2
6   1330642 2
7   1330642 1
8   1330642 1
9   411741  1
10  411741  1
11  1552476 2
12  1552476 1
13  1552476 1
... ...
... ...

Я хочу получить пропорцию label, равную 2, соответствующую каждому user_id, которая должна выглядеть следующим образом:

user_id label
937922  0.7500
1369473 0
1330642 0.5000
411741  0
1552476 0.3333

Я знаю, что должен как-то использовать pd.groupby и разделить его на pd.groubpy(['user_id']).count()[['type']].
Но мне трудно это сделать, и я не могу искать то, что хочу.
Если не ум, кто-нибудь может мне помочь?
Заранее благодарим.

Ответы [ 3 ]

2 голосов
/ 26 июня 2019

groupby и value_counts дают вам все значения:

df.groupby('user_id').label.value_counts(normalize=True)

Выход:

user_id  label
411741   1        1.000000
937922   2        0.750000
         1        0.250000
1330642  1        0.500000
         2        0.500000
1369473  1        1.000000
1552476  1        0.666667
         2        0.333333
Name: label, dtype: float64
2 голосов
/ 26 июня 2019

Я сделаю groupby + mean

df.label.eq(2).groupby(df.user_id).mean()
user_id
411741     0.000000
937922     0.750000
1330642    0.500000
1369473    0.000000
1552476    0.333333
Name: label, dtype: float64
1 голос
/ 26 июня 2019

Используйте pandas.crosstab как:

df = (pd.crosstab(df['user_id'],df['label'], normalize='index').reset_index()
        .rename_axis(None, axis=1))

print(df)
       user_id         1         2
0       411741  1.000000  0.000000
1       937922  0.250000  0.750000
2      1330642  0.500000  0.500000
3      1369473  1.000000  0.000000
4      1552476  0.666667  0.333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...