如何对多列数据批量应用MultiLabelBinarizer?
批量对多列应用MultiLabelBinarizer的解决方法
直接传入多列DataFrame调用MultiLabelBinarizer.fit_transform()会失败,因为该方法要求输入是一维可迭代对象(每个元素是标签集合,比如列表、元组),而多列DataFrame是二维结构,不符合输入要求。下面提供两种可行的批量处理方案:
方案1:合并多列为单标签列后统一二值化
适合需要将所有列的标签合并,生成包含所有出现过的标签的统一二值化矩阵的场景:
import pandas as pd from sklearn.preprocessing import MultiLabelBinarizer # 示例数据(替换为你的真实数据) df = pd.DataFrame({ 'One': [['a', 'b'], ['c'], []], 'Two': [['b', 'd'], ['a'], ['c']], 'Twenty': [['e'], [], ['a', 'e']] }) cols = ['One', 'Two', 'Twenty'] # 你的20列列表 # 把每行的多列标签合并成一个扁平列表 combined_labels = df[cols].apply(lambda row: [item for sublist in row for item in sublist], axis=1) # 应用MultiLabelBinarizer mlb = MultiLabelBinarizer() binarized_df = pd.DataFrame( mlb.fit_transform(combined_labels), columns=mlb.classes_, index=df.index )
方案2:对每列单独二值化后合并结果
适合需要保留原列维度信息(区分不同列的相同标签)的场景,最终列名会带上原列前缀:
import pandas as pd from sklearn.preprocessing import MultiLabelBinarizer cols = ['One', 'Two', 'Twenty'] mlb = MultiLabelBinarizer() binarized_dfs = [] for col in cols: # 对当前列单独二值化,给标签列名加上原列前缀 binarized_col = pd.DataFrame( mlb.fit_transform(df[col]), columns=[f"{col}_{cls}" for cls in mlb.classes_], index=df.index ) binarized_dfs.append(binarized_col) # 合并所有二值化结果 binarized_df = pd.concat(binarized_dfs, axis=1)
额外提示
- 如果你的列存储的是字符串格式的标签(比如用逗号分隔),需要先转换为列表:
df[col] = df[col].str.split(',') - 方案1中,同一行多列出现的重复标签,二值化时会自动视为单个标签,不影响最终结果。
内容的提问来源于stack exchange,提问作者Anya Pilipentseva
相关产品推荐
相关产品推荐

