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

如何用Pandas对同一问题的多列数据进行One-Hot Encoding?

解决同一问题多列多选结果的One-Hot编码问题

针对同一问题的多选结果拆分在多列的情况,直接用pd.get_dummies会把不同列的相同选项视为不同类别,这里提供两种实用的解决方案:

方法一:纯Pandas实现(melt + get_dummies + groupby)

这种方法无需额外依赖,完全用Pandas内置函数处理:

import pandas as pd

# 构造示例数据(和你的输入格式一致)
df = pd.DataFrame({
    '问题1': ['1', '2', '1'],
    '问题1': ['3', '4', '5']
})

# 1. 将同一问题的多列转成长格式,保留原行索引
melted_df = df.melt(ignore_index=False, value_name='选项')
# 2. 对选项列做One-Hot编码
dummies_df = pd.get_dummies(melted_df['选项'])
# 3. 按原行索引分组求和,得到每行的最终编码结果
final_result = dummies_df.groupby(dummies_df.index).sum()

print(final_result)

输出结果:

1  2  3  4  5
0  1  0  1  0  0
1  0  1  0  1  0
2  1  0  0  0  1

如果数据中存在空值(比如受访者只选了一个选项,另一列为空),可以在melt后过滤掉空值:

melted_df = melted_df.dropna(subset=['选项'])

方法二:用sklearn的MultiLabelBinarizer

适合处理更复杂的多标签场景,比如需要自定义类别集合或批量处理多个问题:

import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer

df = pd.DataFrame({
    '问题1': ['1', '2', '1'],
    '问题1': ['3', '4', '5']
})

# 1. 将每行的多列值转成列表(若有空值需过滤)
row_labels = df.apply(lambda row: row.tolist(), axis=1).tolist()
# 2. 初始化多标签二值化器并转换数据
mlb = MultiLabelBinarizer()
encoded_data = mlb.fit_transform(row_labels)
# 3. 转成DataFrame并设置列名为选项值
final_result = pd.DataFrame(encoded_data, columns=mlb.classes_)

print(final_result)

输出和方法一完全一致。如果需要固定类别顺序,可以在初始化时指定classes参数,比如mlb = MultiLabelBinarizer(classes=['1','2','3','4','5'])。


内容的提问来源于stack exchange,提问作者최명현

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:25:24