pandas - 我如何知道数据框中不同用户的最常见值?
问题描述
一个数据框“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
解决方案
使用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
推荐阅读
- file-upload - 如何上传超过 2MB 的文件(yii2)
- java - 对两个链表求和时如何从余数中取 1?
- tensorflow - CUDA_ERROR_OUT_OF_MEMORY 仅在评估阶段
- python-3.x - 如何以表格格式格式化 Python 有序字典
- javascript - 超链接在手机上无法点击,在桌面上可以正常工作
- asp.net-core - 如何在 AspNetCore 2.2 NLog 中关闭 Microsoft 日志
- c# - 为什么函数没有递归地返回所有的孩子?
- api - 向数据库发送数据时如何进行加载
- c++ - boost::iostreams::::copy 似乎太慢了
- javascript - 使用门户反应打开新标签