如何从具有多个值和预定义类别的列表中创建虚拟对象? [复制]

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_dummiesany 沿着假人的原始索引。

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))

【讨论】:

我找到了答案,非常感谢,下次我会记住这一点

以上是关于如何从具有多个值和预定义类别的列表中创建虚拟对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有不同长度列表的字典中创建字典列表

如何在 Rails 中创建类别

在 Android Studio 中创建一个包含多个对象的列表视图

如何在 Pandas 中创建具有自己级别的类别?

模型可以有 ForeignKey 对象的列表吗?

如何从单个数据框中创建具有不同内容的多个 PDF?