Python:按用户统计不同类型下各操作的出现次数
解决方案:按用户统计不同Type下的Action次数
嘿,这个需求用Pandas分分钟就能搞定,我给你两种实用的方法,你可以按需选择~
方法一:拼接分类列 + 透视表
先把原始数据转换成DataFrame,再通过拼接Type和Action得到目标里的列名格式,最后用透视表统计次数:
import pandas as pd # 1. 构造原始DataFrame data = { 'User': ['User1', 'User1', 'User2', 'User2', 'User2', 'User3', 'User3', 'User4', 'User4', 'User1', 'User1'], 'Type': ['Game', 'Game', 'Movie', 'Movie', 'Movie', 'Movie', 'Movie', 'Game', 'Movie', 'Movie', 'Movie'], 'Action': ['Start', 'End', 'Start', 'Start', 'End', 'Start', 'End', 'Start', 'Start', 'Start', 'End'] } df = pd.DataFrame(data) # 2. 拼接Type和Action为目标列名格式(Type保持大写,Action转小写并用下划线连接) df['Category'] = df['Type'] + '_' + df['Action'].str.lower() # 3. 用透视表统计每个用户的各分类次数,缺失值自动填0 result = df.pivot_table(index='User', columns='Category', aggfunc='size', fill_value=0).reset_index() # 4. 调整列顺序匹配你要的目标格式 target_columns = ['User', 'Game_start', 'Movie_start', 'Game_end', 'Movie_end'] result = result[target_columns] print(result)
运行后输出的结果完全符合你的预期:
User Game_start Movie_start Game_end Movie_end 0 User1 1 1 1 1 1 User2 0 2 0 1 2 User3 0 1 0 1 3 User4 1 1 0 0
方法二:使用交叉表(crosstab)
如果觉得透视表有点绕,用pd.crosstab交叉表会更直接,步骤基本一致:
import pandas as pd # 1. 构造原始DataFrame(和方法一相同) data = { 'User': ['User1', 'User1', 'User2', 'User2', 'User2', 'User3', 'User3', 'User4', 'User4', 'User1', 'User1'], 'Type': ['Game', 'Game', 'Movie', 'Movie', 'Movie', 'Movie', 'Movie', 'Game', 'Movie', 'Movie', 'Movie'], 'Action': ['Start', 'End', 'Start', 'Start', 'End', 'Start', 'End', 'Start', 'Start', 'Start', 'End'] } df = pd.DataFrame(data) # 2. 拼接分类列 df['Category'] = df['Type'] + '_' + df['Action'].str.lower() # 3. 交叉表直接统计用户与分类的次数分布 result = pd.crosstab(df['User'], df['Category']).reset_index() # 4. 调整列顺序 target_columns = ['User', 'Game_start', 'Movie_start', 'Game_end', 'Movie_end'] result = result[target_columns] print(result)
两种方法都能达到你要的效果,选你觉得顺手的就行~
内容的提问来源于stack exchange,提问作者Calafalas
相关产品推荐
相关产品推荐

