如何在Pandas中根据另一列的标签创建独热编码新列?
问题描述
我有一个包含两列的DataFrame,代码如下:
import pandas as pd pd.DataFrame({"action":['asdasd','fgdgddg','dfgdgdfg','dfgdgdfg','nmwaws'],"classification":['positive','negative','neutral','positive','mixed']})
对应的DataFrame结构为:
action classification asdasd positive fgdgddg negative dfgdgdfg neutral dfgdgdfg positive nmwaws mixed
我希望针对classification列中的每个唯一标签创建4个新列,若对应行包含该标签则赋值1,否则赋值0,期望输出如下:
action classification positive negative neutral mixed asdasd positive 1 0 0 0 fgdgddg negative 0 1 0 0 dfgdgdfg neutral 0 0 1 0 dfgdgdfg positive 1 0 0 0 nmwaws mixed 0 0 0 1
尝试使用sklearn的MultiLabelBinarizer时,它解析的是每个单词的字母而非单词本身,寻求解决方案。
解决方案
方法1:使用pandas内置的get_dummies(推荐)
这是最直接的实现方式,pandas的get_dummies可一键生成符合需求的独热编码列:
import pandas as pd # 初始化原始DataFrame df = pd.DataFrame({ "action": ['asdasd','fgdgddg','dfgdgdfg','dfgdgdfg','nmwaws'], "classification": ['positive','negative','neutral','positive','mixed'] }) # 生成独热编码列并与原DataFrame合并 result = pd.concat([df, pd.get_dummies(df['classification'])], axis=1) print(result)
运行后会自动识别classification列的所有唯一标签,生成对应列并填充0/1,直接得到期望输出。
方法2:正确使用MultiLabelBinarizer
你之前的问题源于MultiLabelBinarizer默认处理可迭代的标签集合而非单个字符串,只需将classification列的每个元素转为单元素列表即可解决:
import pandas as pd from sklearn.preprocessing import MultiLabelBinarizer df = pd.DataFrame({ "action": ['asdasd','fgdgddg','dfgdgdfg','dfgdgdfg','nmwaws'], "classification": ['positive','negative','neutral','positive','mixed'] }) # 转换列格式为单元素列表,适配MultiLabelBinarizer要求 mlb = MultiLabelBinarizer() one_hot = mlb.fit_transform(df['classification'].apply(lambda x: [x])) # 将独热编码转为DataFrame并合并到原数据 one_hot_df = pd.DataFrame(one_hot, columns=mlb.classes_) result = pd.concat([df, one_hot_df], axis=1) print(result)
此方式可正确识别整个单词作为标签,避免拆分字母的问题。
内容的提问来源于stack exchange,提问作者math_guy_shy
相关产品推荐
相关产品推荐

