如何从具有多个值和预定义类别的列表中创建虚拟变量?

时间:2019-07-08 16:58:23

标签: python-3.x pandas dummy-variable

我想改变它:

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() 首先,不使用所有列只是为了在输入中获得具有多个值的虚拟变量,但我想向其中添加预定义的列。

谢谢您的帮助!

3 个答案:

答案 0 :(得分:3)

创建一个新的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

答案 1 :(得分:2)

尝试一下:

function gettext(code) {
  var func = '=VLOOKUP("'+ code +'";\'VA-Texte\'!A1:I383;\'VA-Texte\'!E1;0)'; 
  return func;
}

答案 2 :(得分:2)

sklearn的良好做法

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()

print (pd.DataFrame(mlb.fit_transform(df['label']),columns=mlb.classes_, index=df.index))