如果要用0
和1
填充的指标列仅将MultiLabelBinarizer
与DataFrame.reindex
一起使用,如果要按列表更改列的顺序,并且如果可能不存在某些值,则仅添加0
列:
columns = ['shirt','shoe','tie','hat']
data = [['hat','tie'],['shoe','shirt'],['tie','shirt',]]
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
df = (pd.DataFrame(mlb.fit_transform(data),columns=mlb.classes_)
.reindex(columns,axis=1,fill_value=0))
print (df)
shirt shoe tie hat
0 0 0 1 1
1 1 1 1 0
2 1 0 1 0
或Series.str.get_dummies
:
df = pd.Series(data).str.join('|').str.get_dummies().reindex(columns,fill_value=0)
print (df)
shirt shoe tie hat
0 0 0 1 1
1 1 1 1 0
2 1 0 1 0
,
这是使用collections.Counter
的一种方法。
例如:
from collections import Counter
columns = ['shirt','shirt']]
data = map(Counter,data)
#df = pd.DataFrame(data,columns=columns)
df = pd.DataFrame(data,columns=columns).fillna(0).astype(int)
print(df)
输出:
shirt shoe tie hat
0 0 0 1 1
1 1 1 1 0
2 1 0 1 0
,
您可以尝试将数据转换为数据框:
data = [['hat',]]
df = pd.DataFrame(data)
df
0 1 2
0 hat tie None
1 shoe tie shirt
2 tie shirt None
他们使用:
pd.get_dummies(df.stack()).groupby(level=0).agg('sum')
hat shirt shoe tie
0 1 0 0 1
1 0 1 1 1
2 0 1 0 1
说明:
df.stack()返回一个MultiIndex系列:
0 0 hat
1 tie
1 0 shoe
1 tie
2 shirt
2 0 tie
1 shirt
dtype: object
如果获得该系列的虚拟值,则会得到:
hat shirt shoe tie
0 0 1 0 0 0
1 0 0 0 1
1 0 0 0 1 0
1 0 0 0 1
2 0 1 0 0
2 0 0 0 0 1
1 0 1 0 0
然后,您只需要按索引分组并使用sum
合并它们(因为我们知道get_dummies之后将只有一或零):
df = pd.get_dummies(df.stack()).groupby(level=0).agg('sum')
本文链接:https://www.f2er.com/2901441.html