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
相关产品推荐
相关产品推荐

