如何高效将不规则列表转换为含独热编码列的DataFrame?
高效实现不规则列表的独热编码DataFrame
给定你的不规则标签列表,最高效的实现方式是借助sklearn.preprocessing.MultiLabelBinarizer——它专门针对多标签场景做独热编码,性能优于纯pandas的实现方案,尤其是数据规模较大时。
具体代码实现:
import pandas as pd from sklearn.preprocessing import MultiLabelBinarizer # 你的输入列表 data = [['E', 'A', 'P'], ['E', 'A', 'X', 'P'], ['E', 'A', 'P'], ['P'], ['E', 'A', 'X', 'P'], ['E', 'A', 'P'], ['A', 'X', 'P'], ['E', 'A', 'P'], ['E', 'A', 'P'], ['E', 'A', 'X', 'P'], ['E', 'A', 'P'], ['E', 'A', 'P'], ['A', 'X', 'P']] # 指定目标列的固定顺序 target_cols = ['E', 'A', 'X', 'P'] # 初始化多标签编码器,指定类别顺序 mlb = MultiLabelBinarizer(classes=target_cols) # 转换数据得到独热编码数组 encoded_data = mlb.fit_transform(data) # 转换为DataFrame df = pd.DataFrame(encoded_data, columns=mlb.classes_) print(df)
输出结果示例:
E A X P 0 1 1 0 1 1 1 1 1 1 2 1 1 0 1 3 0 0 0 1 4 1 1 1 1 5 1 1 0 1 6 0 1 1 1 7 1 1 0 1 8 1 1 0 1 9 1 1 1 1 10 1 1 0 1 11 1 1 0 1 12 0 1 1 1
为什么这是最高效的?
MultiLabelBinarizer是sklearn针对多标签场景优化过的工具,底层实现高效,处理大规模数据时比循环遍历或pandas的get_dummies+explode+groupby组合快得多。- 可以直接指定列的顺序,无需后续调整列位置,一步到位。
如果不想依赖sklearn,也可以用纯pandas的方案,但性能稍差:
import pandas as pd target_cols = ['E', 'A', 'X', 'P'] # 生成每一行的独热编码字典,再转成DataFrame df = pd.DataFrame([{col: 1 if col in row else 0 for col in target_cols} for row in data])
这种写法简洁,但数据量大时,列表推导的循环会比sklearn的优化实现慢。
内容的提问来源于stack exchange,提问作者Ossz
相关产品推荐
相关产品推荐

