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

使用MultiLabelBinarizer处理LanguageAdmired列报错:TypeError(float不可迭代)

问题:Stack Overflow 2024调查数据多值变量编码失败

处理Stack Overflow 2024调查CSV数据时,使用MultiLabelBinarizer对Employment列进行独热编码成功,但处理LanguageAdmired列时触发以下错误:

错误信息

826 class_mapping = defaultdict(int)
    827 class_mapping.default_factory = class_mapping.__len__
--> 828 yt = self._transform(y, class_mapping)
    830 # 排序类别并重排列
    831 tmp = sorted(class_mapping, key=class_mapping.get)
...
--> 901     for label in labels:
    902         try:
    903             index.add(class_mapping[label])

TypeError: 'float' object is not iterable

错误原因

MultiLabelBinarizer要求每个输入样本是可迭代的标签集合(如列表),但LanguageAdmired列中存在float类型的NaN值:

  • 虽然代码中用fillna('Other')尝试填充空值,但str.split()方法对NaN值会返回NaN(而非列表),导致部分行的类型仍为float,触发迭代错误。

解决方案

确保LanguageAdmired列的所有值处理后都是可迭代的列表,可通过以下两种方式修复:

方式1:填充后强制转换为列表

在str.split()后,再次用fillna()将NaN替换为包含'Other'的列表:

df['LanguageAdmired'] = df['LanguageAdmired'].fillna('Other').str.split(';').fillna(['Other'])

方式2:使用apply统一处理

通过apply函数直接将非字符串值转换为['Other']列表:

df['LanguageAdmired'] = df['LanguageAdmired'].apply(lambda x: x.split(';') if isinstance(x, str) else ['Other'])

修改后的完整代码

import pandas as pd
import gdown # pip install gdown
from sklearn.preprocessing import MultiLabelBinarizer

file_id = '1ul_F8Moo9jIGG5pAhUtYz-dIktQXp1Wf'
url = f'https://drive.google.com/uc?id={file_id}'
output = 'survey_results_public.csv'
gdown.download(url, output, quiet=False) # 需等待数秒(150MB CSV文件)


df = pd.read_csv(output)


df.drop('ResponseId', axis=1, inplace=True)
df = df[~df.duplicated(keep='first')].copy()

# 修复LanguageAdmired列的空值处理
df['LanguageAdmired'] = df['LanguageAdmired'].fillna('Other').str.split(';').fillna(['Other'])
df['Employment'] = df['Employment'].str.split(';')


# 处理Employment列
mlb = MultiLabelBinarizer()
binary_labels = mlb.fit_transform(df['Employment'])
df_labels = pd.DataFrame(binary_labels, columns=['Employment_' + c for c in mlb.classes_])
df = pd.concat([df, df_labels], axis=1).copy()


# 处理LanguageAdmired列
mlb2 = MultiLabelBinarizer()
binary_labels = mlb2.fit_transform(df['LanguageAdmired'])
df_labels = pd.DataFrame(binary_labels, columns=['LanguageAdmired_' + c for c in mlb2.classes_])
df = pd.concat([df, df_labels], axis=1)

print(df.shape)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:16:16