我有一个Pandas DataFrame()
,并且其中的某些列是Pythons' lists
,其中包含strings
。
我想将这些列转换成可对字符串进行“二进制化”并计算其外观的虚拟变量。
作为一个简单的例子,我们可以看下面的
import pandas
df = pd.DataFrame({"Hey":[['t1', 't2', 't1', 't3', 't1', 't3'], ['t2', 't2', 't1']]})
df
Out[54]:
Hey
0 [t1, t2, t1, t3, t1, t3]
1 [t2, t2, t1]
我已经做到了以下几点:
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
pd.DataFrame(mlb.fit_transform(df['Hey']), columns=list(map(lambda x: 'Hey_' + x, mlb.classes_)))
Out[55]:
Hey_t1 Hey_t2 Hey_t3
0 1 1 1
1 1 1 0
不计入他们的外表,只对发生的事件产生1,对不出现的事件产生0。我想要以下输出:
Hey_t1 Hey_t2 Hey_t3
0 3 1 2
1 1 2 0
数数他们的外表。
答案 0 :(得分:5)
使用CountVectorizer
,但必须加入list
:
from sklearn.feature_extraction.text import CountVectorizer
countvec = CountVectorizer()
counts = countvec.fit_transform(df['Hey'].str.join(' '))
df = pd.DataFrame(counts.toarray(), columns=countvec.get_feature_names())
print (df)
t1 t2 t3
0 3 1 2
1 1 2 0
另一种解决方案:
df1 = (pd.DataFrame(df['Hey'].values.tolist())
.stack()
.groupby(level=0)
.value_counts()
.unstack(fill_value=0))
print (df1)
t1 t2 t3
0 3 1 2
1 1 2 0
或者:
from collections import Counter
df1 = (pd.DataFrame([Counter(x) for i, x in df['Hey'].iteritems()], index=df.index)
.fillna(0).astype(int))
print (df1)
t1 t2 t3
0 3 1 2
1 1 2 0
答案 1 :(得分:1)
基于Counter
的简洁选择:
from collections import Counter
df = (pd.DataFrame([Counter(x) for i, x in df['Hey'].items()], index=df.index)
.fillna(0, downcast='infer'))
df
t1 t2 t3
0 3 1 2
1 1 2 0
答案 2 :(得分:0)
我认为您对sklearn.preprocessing.MultiLabelBinarizer有误解。 由于它被称为Binarizer,它计算是否发生密钥。也就是说,该值是二值化的:如果发生密钥,则为1,否则为0。不计算发生次数。