如何在Pandas DataFrame中将多值分类列转换为虚拟变量列并移除原列
解决方案:Pandas多值列转独热编码并合并
没问题,这是个很常见的多类别列转独热编码需求,针对逗号分隔的多值列,我们可以用Pandas的内置工具快速实现,全程代码简洁易懂,步骤如下:
步骤拆解与代码实现
1. 构造原始DataFrame(已有数据源可跳过)
先还原你给出的示例数据:
import pandas as pd data = { 'ID': [0, 1, 2, 3], 'column_factors': ['fact1', 'fact1, fact2', 'fact3', 'fact1,fact4'], 'column1': ['d', 'a', 'b', 'c'], 'column2': ['w', 'x', 'y', 'z'] } df = pd.DataFrame(data)
2. 统一多值列的分隔格式
观察数据能看到,column_factors里有两种分隔形式:fact1, fact2(逗号加空格)和fact1,fact4(纯逗号),为了避免生成带空格的列名,先统一成纯逗号分隔:
df['column_factors'] = df['column_factors'].str.replace(', ', ',')
3. 生成独热编码虚拟列
用Pandas的str.get_dummies()方法直接处理多值列,它会自动识别所有唯一的factor,生成对应0/1值的列:
factor_dummies = df['column_factors'].str.get_dummies(sep=',')
4. 合并数据并整理结构
把生成的虚拟列和原DataFrame合并,同时移除原来的column_factors列,最后调整列顺序匹配你的需求:
# 合并数据:去掉原列 + 合并虚拟列 result_df = pd.concat([df.drop('column_factors', axis=1), factor_dummies], axis=1) # 调整列顺序(可选,完全匹配目标输出结构) result_df = result_df[['ID', 'fact1', 'fact2', 'fact3', 'fact4', 'column1', 'column2']]
最终输出
运行上述代码后,result_df就是你想要的结构:
ID fact1 fact2 fact3 fact4 column1 column2 0 0 1 0 0 0 d w 1 1 1 1 0 0 a x 2 2 0 0 1 0 b y 3 3 1 0 0 1 c z
补充说明
- 如果你的
column_factors里没有混合空格的情况,可以跳过第二步的replace操作,直接用str.get_dummies(sep=','); str.get_dummies()会自动识别所有出现过的factor,不需要手动指定要生成fact1到fact4这些列,非常灵活;- 调整列顺序的步骤是可选的,如果不关心列的顺序,直接合并即可。
内容的提问来源于stack exchange,提问作者Watzinki
相关产品推荐
相关产品推荐

