熊猫-从出现次数众多的可迭代对象中获取虚拟对象

时间:2018-08-20 06:23:39

标签: python pandas scikit-learn

我有一个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

数数他们的外表。

3 个答案:

答案 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。不计算发生次数。