Python-尝试从具有字符串列表的列中创建二进制功能

时间:2018-08-13 00:47:37

标签: python pandas dataframe

我很难拿出清晰的标题,但举个例子可以使事情变得更清楚。

Index C1
1     [dinner]
2     [brunch, food]
3     [dinner, fancy]

现在,我想为该列中的每个唯一值创建一组二进制功能。

上面的示例将变为:

Index C1               dinner  brunch  fancy food
1     [dinner]         1       0       0     0
2     [brunch, food]   0       1       0     1
3     [dinner, fancy]  1       0       1     0

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

对于高性能解决方案,我建议通过列出您的列来创建一个新的DataFrame。

pd.get_dummies(pd.DataFrame(df.C1.tolist()), prefix='', prefix_sep='')

   brunch  dinner  fancy  food
0       0       1      0     0
1       1       0      0     1
2       0       1      1     0

这将比apply(pd.Series)快得多。

此功能假定列表没有更多相同的值(例如['dinner', ..., 'dinner'])。如果他们这样做,那么您将需要一个额外的groupby步骤:

(pd.get_dummies(
    pd.DataFrame(df.C1.tolist()), prefix='', prefix_sep='')
   .groupby(level=0, axis=1)
   .sum())

好吧,如果您的数据是这样的,那么您正在寻找的不再是“二进制”。

答案 1 :(得分:2)

也许使用MultiLabelBinarizer

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
pd.DataFrame(mlb.fit_transform(df.C1),columns=mlb.classes_,index=df.Index).reset_index()
Out[970]: 
   Index  brunch  dinner  fancy  food
0      1       0       1      0     0
1      2       1       0      0     1
2      3       0       1      1     0