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

Python从DataFrame生成特征表:将会话路径步骤转换为独热编码列

实现方案(基于Pandas)

假设原有数据已加载为DataFrame对象df,你提前准备好的所有step去重列表为all_step_values,以下两种方案均可实现需求:


方案1:Melt透视法(通用高效,无需提前准备step列表也可运行)

  • 第一步:提取所有step列名
step_cols = [col for col in df.columns if col.startswith('step')]
  • 第二步:宽表转长表,过滤空值、去重(同一会话的重复step只保留1条)
melted = df.melt(id_vars=['id', 'event'], value_vars=step_cols, value_name='step').dropna(subset=['step'])
melted = melted.drop_duplicates(subset=['id', 'step'])
  • 第三步:长表转回宽表,生成0/1特征矩阵
feature_matrix = melted.pivot_table(
    index=['id', 'event'], 
    columns='step', 
    aggfunc='size', 
    fill_value=0
).reset_index()
  • 第四步(可选,适配你已有的step列表):补全列表中存在但数据中未出现的step列,默认值设为0,同时调整列顺序
# 补全缺失step列
for step in all_step_values:
    if step not in feature_matrix.columns:
        feature_matrix[step] = 0
# 调整列顺序为 id -> 所有step -> event
feature_matrix = feature_matrix[['id'] + all_step_values + ['event']]

方案2:集合匹配法(适合已提前准备完整step列表的场景,代码更简洁)

直接按行计算每个会话的访问step集合,再批量生成0/1列:

step_cols = [col for col in df.columns if col.startswith('step')]
# 每行所有非空step转成集合
df['step_set'] = df[step_cols].apply(lambda x: set(x.dropna()), axis=1)
# 批量生成所有step的0/1特征列
for step in all_step_values:
    df[step] = df['step_set'].apply(lambda x: 1 if step in x else 0)
# 提取最终需要的列
result = df[['id'] + all_step_values + ['event']]

性能说明

如果数据量在100万行以上,优先选方案1,Pandas的向量化操作比方案2的行级apply运行效率高很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:24:00