如何对DataFrame中存储列表的类别列应用One-Hot Encoder?
对列表型分类列实现One-Hot编码的内置工具方案
假设我们有如下DataFrame:
| ID | CATEGORIES |
|---|---|
| 0 | ['A'] |
| 1 | ['A', 'C'] |
| 2 | ['B', 'C'] |
我们需要将CATEGORIES列转换为One-Hot编码,预期结果如下:
| ID | A | B | C |
|---|---|---|---|
| 0 | 1 | 0 | 0 |
| 1 | 1 | 0 | 1 |
| 2 | 0 | 1 | 1 |
无需自行编写低效代码,Python已有成熟工具包可以高效实现该需求,以下是两种常用方案:
方案一:使用Pandas内置方法
Pandas的字符串处理工具可以直接适配列表型字段,结合str.join和str.get_dummies快速生成编码:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'ID': [0, 1, 2], 'CATEGORIES': [['A'], ['A', 'C'], ['B', 'C']] }) # 将列表转为分隔符连接的字符串,再生成One-Hot编码 one_hot = df['CATEGORIES'].str.join('|').str.get_dummies(sep='|') # 合并原ID列与编码结果 result = pd.concat([df['ID'], one_hot], axis=1) print(result)
方案二:使用Scikit-learn的MultiLabelBinarizer
如果需要和机器学习流程整合,scikit-learn的MultiLabelBinarizer是专门针对多标签(列表型分类)的编码工具:
import pandas as pd from sklearn.preprocessing import MultiLabelBinarizer # 构造示例数据 df = pd.DataFrame({ 'ID': [0, 1, 2], 'CATEGORIES': [['A'], ['A', 'C'], ['B', 'C']] }) # 初始化多标签二值化器并完成编码 mlb = MultiLabelBinarizer() one_hot_array = mlb.fit_transform(df['CATEGORIES']) one_hot_df = pd.DataFrame(one_hot_array, columns=mlb.classes_) # 合并原ID列与编码结果 result = pd.concat([df['ID'], one_hot_df], axis=1) print(result)
两种方案均适配大规模数据场景,效率远高于手动编写循环逻辑。
内容的提问来源于stack exchange,提问作者sbb
相关产品推荐
相关产品推荐

