如何从具有多个值和预定义类别的列表中创建虚拟对象? [复制]
Posted
技术标签:
【中文标题】如何从具有多个值和预定义类别的列表中创建虚拟对象? [复制]【英文标题】:How to create dummies from list with multiple values and predefined categories? [duplicate] 【发布时间】:2019-11-18 05:45:24 【问题描述】:我想改造一下:
In [4]: df
Out[4]:
label
0 (a, e)
1 (a, d)
2 (b,)
3 (d, e)
到这里:
a b c d e
0 1 0 0 0 1
1 1 0 0 1 0
2 0 1 0 0 0
3 0 0 0 1 1
如您所见,有预定义的列,“a”、“b”、“c”、“d”、“e”和 c 为空但仍然存在。
我尝试了多种类似的方法:df.str.join('|').str.get_dummies() 首先没有所有列,只是为了在输入中获取具有多个值的假人,但我想向其中添加预定义的列。
感谢您的帮助!
【问题讨论】:
您的label
列是一系列元组还是字符串?
【参考方案1】:
试试这个:
df['label'].str.join(sep='*').str.get_dummies(sep='*')
【讨论】:
谢谢! :) 唯一的问题是它不会像我的示例中所示创建“c”列,我在第一个答案的评论中找到了解决方案【参考方案2】:创建一个新的DataFrame,然后stack
+ get_dummies
。 any
沿着假人的原始索引。
pd.get_dummies(pd.DataFrame([*df.label], index=df.index).stack()).any(level=0).astype(int)
a b d e
0 1 0 0 1
1 1 0 1 0
2 0 1 0 0
3 0 0 1 1
因为您有预定义的列,我们可以重新索引并用 0 填充缺失的列。
res = pd.get_dummies(pd.DataFrame([*df.label], index=df.index).stack()).any(level=0)
res = res.reindex(list('abcde'), axis=1).fillna(0).astype(int)
# a b c d e
#0 1 0 0 0 1
#1 1 0 0 1 0
#2 0 1 0 0 0
#3 0 0 0 1 1
【讨论】:
谢谢!!当我使用 df.str.join('|').str.get_dummies() 然后 df.reindex(columns = ['a','b','c','d','e'] , fill_value=0)【参考方案3】:sklearn
的良好做法
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
print (pd.DataFrame(mlb.fit_transform(df['label']),columns=mlb.classes_, index=df.index))
【讨论】:
我找到了答案,非常感谢,下次我会记住这一点以上是关于如何从具有多个值和预定义类别的列表中创建虚拟对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章