Как узнать наиболее частые значения от разных пользователей в кадре данных? - PullRequest
0 голосов
/ 25 апреля 2020

Фрейм данных 'df' записывает каналы закупок разных категорий пользователей:

  user_id channel
0       a      TV
1       a      TV
2       a      TV
3       a     WEB
4       a     WEB
5       b     APP
6       b     APP
7       b      TV
8       b      TV
9       b     WEB
10      c     WEB
11      c     WEB
12      c     WEB
13      c      TV
14      c      TV

Теперь я хочу узнать, какие наиболее распространенные каналы используются разными пользователями. Ожидаемый результат должен быть:

  user_id frequent
0       a       TV
1       b      APP
2       c      WEB

Если результатов несколько, выберите 1-й. Например, для пользователя «b» у него есть 2 заказа от «APP» и 2 от «TV». Здесь мы выбираем «APP»

Я также хочу, чтобы результат сочетался с исходным «df» с преобразованием (возможно):

  user_id channel frequent
0       a      TV       TV
1       a      TV       TV
2       a      TV       TV
3       a     WEB       TV
4       a     WEB       TV
5       b     APP      APP
6       b     APP      APP
7       b      TV      APP
8       b      TV      APP
9       b     WEB      APP
10      c     WEB      WEB
11      c     WEB      WEB
12      c     WEB      WEB
13      c      TV      WEB
14      c      TV      WEB

1 Ответ

1 голос
/ 25 апреля 2020

Используйте GroupBy.transform с Series.mode и выберите первое значение (если существует несколько первых значений):

df['frequent'] = df.groupby('user_id')['channel'].transform(lambda x: x.mode().iat[0])
print (df)
   user_id channel frequent
0        a      TV       TV
1        a      TV       TV
2        a      TV       TV
3        a     WEB       TV
4        a     WEB       TV
5        b     APP      APP
6        b     APP      APP
7        b      TV      APP
8        b      TV      APP
9        b     WEB      APP
10       c     WEB      WEB
11       c     WEB      WEB
12       c     WEB      WEB
13       c      TV      WEB
14       c      TV      WEB

Другое решение с Series.value_counts:

df['frequent'] = (df.groupby('user_id')['channel']
                    .transform(lambda x: x.value_counts().index[0]))
print (df)
   user_id channel frequent
0        a      TV       TV
1        a      TV       TV
2        a      TV       TV
3        a     WEB       TV
4        a     WEB       TV
5        b     APP      APP
6        b     APP      APP
7        b      TV      APP
8        b      TV      APP
9        b     WEB      APP
10       c     WEB      WEB
11       c     WEB      WEB
12       c     WEB      WEB
13       c      TV      WEB
14       c      TV      WEB

Кажется, что существует разница между обработкой, если несколько первых значений, mode значения сортировки, value_counts не:

df['frequent1'] = df.groupby('user_id')['channel'].transform(lambda x: x.mode().iat[0])
df['frequent2'] = df.groupby('user_id')['channel'].transform(lambda x: x.value_counts().index[0])
print (df)
   user_id channel frequent1 frequent2
0        a      TV        TV        TV
1        a      TV        TV        TV
2        a      TV        TV        TV
3        a     WEB        TV        TV
4        a     WEB        TV        TV
5        b    ZAPP        TV      ZAPP <-changed data to APP
6        b    ZAPP        TV      ZAPP
7        b      TV        TV      ZAPP
8        b      TV        TV      ZAPP
9        b     WEB        TV      ZAPP
10       c     WEB       WEB       WEB
11       c     WEB       WEB       WEB
12       c     WEB       WEB       WEB
13       c      TV       WEB       WEB
14       c      TV       WEB       WEB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...