You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求简便方法解决基于指定列表的多标签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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:03:47