【问题标题】: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