如何按组而非字符将列表列转为哑变量?两种尝试均失败
问题根源与解决方案
你得到字符级哑变量的核心原因是:personal_interests列的元素是字符串类型,而非列表/可迭代的兴趣组集合。两种方法都会把字符串拆成单个字符处理,自然得不到预期的组级结果。
第一步:先将字符串列转换为兴趣列表列
假设你的personal_interests列是类似"body,makeup"这种用分隔符(逗号、空格等)连接的字符串,先把它转成列表:
# 示例:逗号分隔的字符串转列表,根据实际分隔符调整 uf['personal_interests'] = uf['personal_interests'].str.split(',') # 如果是空格分隔,用: # uf['personal_interests'] = uf['personal_interests'].str.split()
修正后的两种实现方法
方法一:Pandas 原生方法
直接对列表列使用str.get_dummies,无需额外拼接:
uf_dummies = uf['personal_interests'].str.get_dummies() print(uf_dummies)
如果你的列表元素原本是用特定符号分隔的字符串(比如"body|makeup"),也可以指定sep参数:
uf_dummies = uf['personal_interests'].str.get_dummies(sep='|')
方法二:MultiLabelBinarizer 方法
注意不要重复调用fit_transform(会覆盖之前的类别拟合),改用transform;同时确保输入是列表而非字符串:
from sklearn.preprocessing import MultiLabelBinarizer mlb = MultiLabelBinarizer() # 如果你需要强制包含指定类别(即使样本中没出现),用列表的列表形式拟合 mlb.fit([['body','men_skincare','tools','hand','makeup','hair', 'nail', 'skincare','men_fragrance','fragrance','foot']]) # 用transform而不是fit_transform,避免重新拟合数据 uf_dummies = pd.DataFrame( mlb.transform(uf['personal_interests']), columns=mlb.classes_, index=uf.index ) print(uf_dummies)
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

