You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

代码说明

  1. 生成标记列表:通过apply逐行处理,为每个用户生成长度等于user_events的列表,其中前user_successes个元素为1(成功事件),剩余为0(失败事件)。
  2. 展开为长格式:使用explode将列表类型的success列拆分为多行,每行对应一个事件。
  3. 整理输出:提取user_id和success列,重置索引得到最终结果。

内容的提问来源于stack exchange,提问作者David Masip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:21:15