如何用Pandas按用户分组统计事件出现次数并生成新列
Pandas按用户分组统计事件类型次数并生成新列
这里提供三种实用方法来实现你的需求,以下是具体示例:
方法1:针对单个事件类型生成新列
如果只需要统计某一个特定event_type_id(比如示例中的0)的次数,可以用groupby结合transform,保持原数据行数的同时,将统计结果匹配到每一行对应的用户:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'User': [1, 1, 1, 2, 2, 3], 'event_type_id': [0, 0, 1, 0, 2, 1] }) # 统计每个User的event_type_id=0的次数,存入Post列 df['Post'] = df.groupby('User')['event_type_id'].transform(lambda x: (x == 0).sum())
执行后结果示例:
| User | event_type_id | Post |
|---|---|---|
| 1 | 0 | 2 |
| 1 | 0 | 2 |
| 1 | 1 | 2 |
| 2 | 0 | 1 |
| 2 | 2 | 1 |
| 3 | 1 | 0 |
方法2:统计多个事件类型并生成对应列
如果需要同时统计多种event_type_id的次数并生成多个新列,可用pd.crosstab生成交叉计数表,再合并回原数据:
# 生成用户与事件类型的交叉计数表 count_table = pd.crosstab(df['User'], df['event_type_id']) # 重命名列并合并到原数据 df = df.merge( count_table.rename(columns={0: 'Post', 1: 'Action_1', 2: 'Action_2'}), on='User', how='left' )
执行后会新增Post、Action_1、Action_2三列,分别对应各事件类型的次数。
方法3:批量统计所有事件类型
如果event_type_id的取值较多,可通过groupby+value_counts+unstack批量生成统计列:
# 按用户分组统计各事件类型次数 counts = df.groupby('User')['event_type_id'].value_counts().unstack(fill_value=0) # 重命名列并合并 df = df.merge( counts.rename(columns=lambda x: f'Event_{x}_Count'), on='User', how='left' )
这样会自动为每个event_type_id生成类似Event_0_Count、Event_1_Count的统计列。
内容的提问来源于stack exchange,提问作者Davi de Paulo
相关产品推荐
相关产品推荐

