首页 > 解决方案 > 我如何知道数据框中不同用户的最常见值?

问题描述

一个数据框“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

如果有多个结果,请选择第一个。例如,对于用户“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

标签: pandasdataframe

解决方案


使用GroupBy.transformSeries.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

推荐阅读