如何将Dataframe列中的列表拆分到指定命名列并生成0-1统计矩阵
高效实现方案(适配百万行级数据,无手动循环)
两种方案均为向量化实现,底层基于C运算,性能远高于自定义循环逻辑:
方案1:使用sklearn.MultiLabelBinarizer(推荐,性能最优)
专门针对多标签二值化场景设计,直接输出0-1矩阵:
import pandas as pd from sklearn.preprocessing import MultiLabelBinarizer # 初始化多标签二值化工具 mlb = MultiLabelBinarizer() # 拟合所有标签并生成0-1矩阵 one_hot_arr = mlb.fit_transform(df['data']) # 转换为DataFrame,列名即为标签名 one_hot_df = pd.DataFrame(one_hot_arr, columns=mlb.classes_, index=df.index) # 拼接日期列得到最终结果 final_01_matrix = pd.concat([df['date'], one_hot_df], axis=1)
如果需要生成中间的标签值填充、缺失为NaN的版本,追加以下代码即可:
mid_val_df = one_hot_df.replace(1, pd.Series(one_hot_df.columns, one_hot_df.columns)).replace(0, float('nan')) mid_result = pd.concat([df['date'], mid_val_df], axis=1)
方案2:使用Pandas原生str.get_dummies(无额外依赖)
不需要引入第三方库,纯Pandas实现:
# 将列表拼接为无重复分隔符的字符串,再做独热编码 one_hot_df = df['data'].str.join('|').str.get_dummies() # 拼接日期列 final_01_matrix = pd.concat([df['date'], one_hot_df], axis=1)
注意事项
如果你的data列当前为字符串格式(而非Python列表),需要先做格式转换:
import ast # 安全转换字符串列表为Python列表,性能远高于普通eval df['data'] = df['data'].apply(ast.literal_eval)
你之前使用pd.DataFrame(df['data'].to_list())的逻辑是按列表元素的位置对齐列,而非按标签值对齐,因此无法满足需求。
内容的提问来源于stack exchange,提问作者Germain Roussez
相关产品推荐
相关产品推荐

