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

如何标准化Petfinder API标签后用MultiLabelBinarizer做One-Hot编码?

问题描述

从Petfinder API获取的数据中,tags字段为形容词列表。使用sklearn的MultiLabelBinarizer进行One-Hot编码时,由于词汇存在大小写(如sweet/Sweet)、格式(如"Easy going"与连写形式)差异,被识别为不同词汇,导致编码后出现重复列。

原代码如下:

import pandas as pd
import numpy as np
import sklearn 
from sklearn.preprocessing import MultiLabelBinarizer
enc = MultiLabelBinarizer() #initialize 
enc.fit(df["tags"]) #fitting
tag = enc.transform(df["tags"]) #transform fit 
tclass = enc.classes_ #stores each column list
df2 = pd.DataFrame(data=tag, columns=tclass)
sum_column = df2.sum(axis=0)
print(sum_column)

编码后部分结果:

sweetlovinghappyplayfulSweetLoving
011011
000000
110101
000100

需求:将大写标签合并到对应小写列,实现编码后仅保留唯一标签列,示例结果如下:

sweetlovinghappyplayful
0110
0000
1101
0001
1100
0100

补充说明:编码前tags字段带括号,已通过df["tags"] = df["tags"].str.join(',')处理,但需要统一大小写、空格与连写等格式。


方案一:编码前标准化标签格式(推荐)

从根源避免重复列,在调用MultiLabelBinarizer前对每个标签做统一格式化处理。

标准化规则(可按需调整)

  • 统一转为小写
  • 替换空格为下划线(或直接删除,根据标签习惯选择)
  • 去除多余特殊符号(如果存在)

代码实现

import pandas as pd
import numpy as np
from sklearn.preprocessing import MultiLabelBinarizer

# 定义标签标准化函数
def standardize_tags(tag_list):
    standardized = []
    for tag in tag_list:
        # 转小写
        lower_tag = tag.lower()
        # 替换空格为下划线,可改为lower_tag.replace(" ", "")实现连写
        normalized_tag = lower_tag.replace(" ", "_")
        standardized.append(normalized_tag)
    return standardized

# 如果tags已被转为逗号分隔的字符串,先转回列表
df["tags"] = df["tags"].str.split(',')
# 应用标准化处理
df["tags"] = df["tags"].apply(standardize_tags)

# 执行编码流程
enc = MultiLabelBinarizer()
enc.fit(df["tags"])
tag = enc.transform(df["tags"])
tclass = enc.classes_
df2 = pd.DataFrame(data=tag, columns=tclass)

sum_column = df2.sum(axis=0)
print(sum_column)

方案二:编码后合并重复列(备选)

如果已完成编码,可通过标准化列名的方式合并重复列:

代码实现

# 对编码后的列名做标准化:转小写+替换空格
standardized_cols = df2.columns.str.lower().str.replace(" ", "_")

# 按标准化列名分组,取最大值(One-Hot编码0/1场景下,只要原列有1则保留1)
df2_merged = df2.groupby(standardized_cols, axis=1).max()

# 查看合并后的结果
sum_column = df2_merged.sum(axis=0)
print(sum_column)

注:如果是计数场景,可将max()替换为sum()。


内容的提问来源于stack exchange,提问作者Ropolola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:55:23