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

如何对同类别类型多列运行get_dummies()函数实现合并独热编码?

合并多列同类症状的独热编码方案

你的需求是将多列中同类症状的独热编码合并为同一列,避免Symptom_A_Itching和Symptom_B_Itching这类拆分的列,最终得到Symptom_Itching、Symptom_Rash这类统一列。以下是两种可行的实现方案:

方法一:利用MultiLabelBinarizer(推荐)

通过将每行的有效症状整合为列表,再用MultiLabelBinarizer直接生成统一的独热编码,逻辑简洁高效:

import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer

# 读取并预处理数据
data_frame = pd.read_csv('dataset.csv')
features = data_frame.iloc[:, 1:]
features = features.fillna('')  # 注意必须赋值,fillna默认不修改原DataFrame

# 提取每行非空的症状,组成列表
symptom_rows = features.apply(lambda row: [sym for sym in row if sym], axis=1)

# 生成统一的独热编码
mlb = MultiLabelBinarizer()
encoded_data = mlb.fit_transform(symptom_rows)
x = pd.DataFrame(encoded_data, columns=[f'Symptom_{label}' for label in mlb.classes_])

原理说明

MultiLabelBinarizer会识别所有行中出现的唯一症状,为每个症状生成一列,只要该行任意一列出现过该症状,对应列就标记为1,完美实现跨列合并编码。


方法二:Melt+Get_Dummies+GroupBy

通过数据重塑将多列症状转为单列,再编码后按行聚合,适合习惯用pandas原生方法的场景:

import pandas as pd

data_frame = pd.read_csv('dataset.csv')
features = data_frame.iloc[:, 1:]
features = features.fillna('')

# 重置索引,保留原行的标识
features = features.reset_index()
# 将所有症状列转为"索引-症状"的纵向结构
melted_features = features.melt(id_vars='index', value_name='Symptom')
# 过滤空症状
melted_features = melted_features[melted_features['Symptom'] != '']
# 生成独热编码
symptom_dummies = pd.get_dummies(melted_features['Symptom'], prefix='Symptom')
# 按原行索引分组求和,得到每行的最终编码
x = symptom_dummies.groupby(melted_features['index']).sum().reset_index(drop=True)

原理说明

  • melt将多列症状合并为一列,消除原列的区分
  • get_dummies对单列症状生成编码
  • groupby按原行聚合,同一行内的重复症状会被求和(结果为1,因为只要出现过就标记)

你之前尝试无效的原因

直接修改列名为Symptom或调整get_dummies的prefix参数,本质还是让pandas对每一列单独编码,列与列之间的症状依然会被拆分处理。必须先将多列的症状内容合并到同一维度,再进行编码才能实现需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:27:35