如何获得一个热编码向量,如下表所示

时间:2018-02-08 20:42:42

标签: python pandas

我试图以下面的形式获取我的表格。出于某种原因,我无法使我的枢轴代码工作。

df = pd.DataFrame([('a','f1'), ('a','f2'),('a','f3') ,('b','f4'),('c','f2'), ('c','f4')], columns = ['user', 'val'])


df 
---
user    val
a      f1
a      f2
a      f3
b      f4
c      f2
c      f4 


>> output 

user    f1  f2  f3  f4
a       1   1   1   0
b       0   0   0   1
c       1   0   1   0

3 个答案:

答案 0 :(得分:5)

选项1
get_dummies groupby + sum

df.set_index('user').val.str.get_dummies().sum(level=0) f1 f2 f3 f4 user a 1 1 1 0 b 0 0 0 1 c 0 1 0 1
groupby

选项2
value_counts + unstack + df.groupby('user').val.value_counts().unstack(fill_value=0) val f1 f2 f3 f4 user a 1 1 1 0 b 0 0 0 1 c 0 1 0 1

pivot_table

选项3
size aggfuncdf.pivot_table(index='user', columns='val', aggfunc='size', fill_value=0) val f1 f2 f3 f4 user a 1 1 1 0 b 0 0 0 1 c 0 1 0 1

device

答案 1 :(得分:3)

似乎pd.crosstab(df['user'], df['val'])也可以。

答案 2 :(得分:2)

又一种解决方案。

In [82]: from sklearn.feature_extraction.text import CountVectorizer

In [83]: cv = CountVectorizer()

In [84]: d2 = df.groupby('user')['val'].agg(' '.join).reset_index(name='val')

In [85]: d2
Out[85]:
  user       val
0    a  f1 f2 f3
1    b        f4
2    c     f2 f4

In [86]: r = pd.SparseDataFrame(cv.fit_transform(d2['val']),
    ...:                                 d2.index,
    ...:                                 cv.get_feature_names(),
    ...:                                 default_fill_value=0)
    ...:

In [88]: d2[['user']].join(r)
Out[88]:
  user  f1  f2  f3  f4
0    a   1   1   1   0
1    b   0   0   0   1
2    c   0   1   0   1