如何用Pandas将用户事件成功表转为长格式事件表(规避循环)
Pandas宽表转长表:生成按事件数展开的成功标记表
问题描述
现有如下结构的Pandas DataFrame:
import pandas as pd df = pd.DataFrame({ "user_id": [1, 2, 3], "user_events": [1, 2, 3], "user_successes": [0, 1, 2] })
需要将其转换为长格式:每行代表一个用户的单个事件,新增success列标记该事件是否成功。期望输出如下:
out_df = pd.DataFrame({ "user_id": [1, 2, 2, 3, 3, 3], "success": [0, 1, 0, 1, 1, 0] })
要求使用最简Pandas方法,规避遍历用户创建DataFrame再追加的循环方式。
解决方案
可以通过apply生成每个用户的成功标记列表,再用explode展开为多行,代码如下:
import pandas as pd df = pd.DataFrame({ "user_id": [1, 2, 3], "user_events": [1, 2, 3], "user_successes": [0, 1, 2] }) # 为每个用户生成对应长度的success标记列表 df['success'] = df.apply( lambda x: [1]*x['user_successes'] + [0]*(x['user_events'] - x['user_successes']), axis=1 ) # 展开列表为多行,提取目标列并重置索引 out_df = df.explode('success')[['user_id', 'success']].reset_index(drop=True) print(out_df)
代码说明
- 生成标记列表:通过
apply逐行处理,为每个用户生成长度等于user_events的列表,其中前user_successes个元素为1(成功事件),剩余为0(失败事件)。 - 展开为长格式:使用
explode将列表类型的success列拆分为多行,每行对应一个事件。 - 整理输出:提取
user_id和success列,重置索引得到最终结果。
内容的提问来源于stack exchange,提问作者David Masip
相关产品推荐
相关产品推荐

