Pandas如何基于DataFrame单列数组的元素出现频率创建新列
Pandas 按列表元素生成二值标识列实现
问题说明
现有如下结构的DataFrame:
column_1 column_2 ['a','c'] 1 ['b','c'] 2 ['a','b','c'] 1
需要根据column_1列中存储的列表元素,新增a/b/c三个列:对应元素在该行column_1的列表中存在时赋值为1,不存在则赋值为0,期望输出结果如下:
a b c column_2 1 0 1 1 0 1 1 2 1 1 1 1
实现方案
方案1:纯pandas实现(无额外依赖,推荐)
利用pandas自带的字符串哑变量方法实现,代码最简洁:
# 先将column_1的列表拼接为分隔字符串,再生成独热编码 dummy_cols = df["column_1"].str.join("|").str.get_dummies() # 拼接编码列与原保留列,调整顺序即可得到结果 result = pd.concat([dummy_cols, df["column_2"]], axis=1)
方案2:使用sklearn的多标签二值化工具
如果后续需要做训练集/测试集的编码转换对齐,用MultiLabelBinarizer更方便:
from sklearn.preprocessing import MultiLabelBinarizer mlb = MultiLabelBinarizer() # 拟合所有标签并转换为二值矩阵 binary_mat = mlb.fit_transform(df["column_1"]) # 转为DataFrame后和原列拼接 dummy_cols = pd.DataFrame(binary_mat, columns=mlb.classes_) result = pd.concat([dummy_cols, df["column_2"]], axis=1)
两种方案执行后得到的result打印效果完全匹配预期输出。
内容的提问来源于stack exchange,提问作者Chris_007
相关产品推荐
相关产品推荐

