如何对同类别类型多列运行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
相关产品推荐
相关产品推荐

