如何将DataFrame中包含列表的列转换为独热编码列?
如何将DataFrame中包含列表的列转换为独热编码列?
嗨,这个需求我平时处理数据时也常碰到,给你分享两个高效的实现方法,都是亲测好用的:
先把你的示例数据贴出来,方便对照操作:
import pandas as pd import numpy as np df = pd.DataFrame({'id':range(1,4), 'items':[['A', 'B'], ['A', 'B', 'C'], ['A', 'C']]})
方法一:纯Pandas实现(无需额外库)
这种方法不用导入其他工具,靠Pandas自带的方法就能搞定,步骤清晰还简洁:
- 把
items列的列表展开成多层索引结构 - 对展开后的元素生成独热编码
- 按原DataFrame的索引求和,得到每行对应的编码结果
- 最后把编码结果和原DataFrame合并
代码如下:
# 生成独热编码部分 one_hot = pd.DataFrame(df['items'].tolist()).stack().str.get_dummies().sum(level=0) # 合并到原DataFrame result = pd.concat([df, one_hot], axis=1) print(result)
运行后就能得到你想要的输出:
id items A B C 0 1 [A, B] 1 1 0 1 2 [A, B, C] 1 1 1 2 3 [A, C] 1 0 1
方法二:用sklearn的MultiLabelBinarizer(多标签场景更直观)
如果你的项目已经在使用sklearn,那这个方法逻辑更直白,专门针对多标签的编码需求:
- 导入
MultiLabelBinarizer类 - 用它拟合并转换
items列的列表数据 - 把转换结果转成DataFrame,指定列名为对应的标签
- 和原DataFrame合并即可
代码示例:
from sklearn.preprocessing import MultiLabelBinarizer mlb = MultiLabelBinarizer() # 转换数据并生成对应DataFrame one_hot = pd.DataFrame(mlb.fit_transform(df['items']), columns=mlb.classes_, index=df.index) # 合并数据 result = pd.concat([df, one_hot], axis=1) print(result)
这个方法的输出和第一种完全一致,而且如果items里出现新的标签,它会自动识别并生成对应列,用起来特别省心。
你可以根据自己的项目环境选合适的方法,两种都能高效完成需求~
备注:内容来源于stack exchange,提问作者DaCard
相关产品推荐
相关产品推荐

