【问题标题】:Python - Attempting to create binary features from a column with lists of stringsPython - 尝试从包含字符串列表的列创建二进制特征
【发布时间】:2019-01-19 16:36:02
【问题描述】:

我很难想出清晰的标题,但举个例子应该会让事情更清楚。

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

任何帮助将不胜感激。

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

对于高效的解决方案,我建议通过列出您的列来创建一个新的 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())

好吧,如果您的数据是这样的,那么您要查找的就不再是“二进制”了。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 2022-07-25
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多