使用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
相关产品推荐
相关产品推荐

