求简便方法解决基于指定列表的多标签One-Hot编码问题
问题
现有如下数据集:
data Positions 0 ST, LW 1 CF, RW, ST 2 LW, CAM 3 GK 4 CAM, CM 5 CB 6 ST 7 CM, CDM 8 LW, CF 9 GK
另有指定类别列表:
lst = ['CAM', 'CB', 'LB', 'LWB', 'LW', 'CF', 'ST', 'RWB', 'GK', 'RM', 'LM', 'CM', 'CDM', 'RW', 'RB']
需要实现类似One-Hot编码的效果:对数据每一行,若该行包含列表中的元素则填1,否则填0,最终结果为(10,15)的形状(10行对应原数据行数,15列对应列表元素数)。示例结果如下:
CAM CB LB LW CF 0 0 0 1 0 0 0 0 0 1
求简便实现方法。
简便实现方案
用Python的pandas库可以快速搞定,核心思路是先拆分位置字符串,再生成编码并对齐指定类别:
方法一:pandas高效实现
import pandas as pd # 构造示例数据(如果已有DataFrame可跳过这步) data = pd.DataFrame({ 'Positions': [ 'ST, LW', 'CF, RW, ST', 'LW, CAM', 'GK', 'CAM, CM', 'CB', 'ST', 'CM, CDM', 'LW, CF', 'GK' ] }) lst = ['CAM', 'CB', 'LB', 'LWB', 'LW', 'CF', 'ST', 'RWB', 'GK', 'RM', 'LM', 'CM', 'CDM', 'RW', 'RB'] # 核心操作 one_hot_result = ( data['Positions'] .str.split(', ', expand=True) # 把每行的位置拆成多列 .stack() # 将多列展开成单行的序列 .str.get_dummies() # 生成初始的one-hot编码 .sum(level=0) # 按原数据的行索引求和,合并同一行的多个位置 .reindex(columns=lst, fill_value=0) # 对齐指定的类别列表,缺失的列自动填0 ) print(one_hot_result)
执行后得到的one_hot_result就是符合要求的(10,15)形状的DataFrame,每个单元格对应1或0。
方法二:纯Python实现(适合小数据)
如果不想用pandas,纯Python循环也能实现,代码如下:
# 提取原数据的位置列 position_rows = data['Positions'].tolist() result = [] for row in position_rows: # 把当前行的位置转成集合,方便快速判断 current_positions = set(row.split(', ')) # 遍历类别列表,生成每行的0/1值 row_values = [1 if cat in current_positions else 0 for cat in lst] result.append(row_values) # 可以转成DataFrame方便查看 import pandas as pd pd.DataFrame(result, columns=lst)
内容的提问来源于stack exchange,提问作者yonggir3213
相关产品推荐
相关产品推荐

