Python试图从包含字符串列表的列中创建二进制特性

2024-09-28 20:16:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难想出一个明确的标题,但一个例子应该让事情更清楚。你知道吗

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

任何帮助都将不胜感激。你知道吗


Tags: 标题indexfood二进制特性事情例子fancy
2条回答

对于高性能的解决方案,我建议通过列出列来创建一个新的数据帧。你知道吗

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

好吧,如果你的数据是这样的,那么你要找的不再是“二进制”了。你知道吗

也许用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

相关问题 更多 >