我很难拿出清晰的标题,但举个例子可以使事情变得更清楚。
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
任何帮助将不胜感激。
答案 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