如何用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,提问作者최명현
相关产品推荐
相关产品推荐

