熊猫有序直方图矩阵

时间:2014-12-12 18:51:56

标签: python numpy pandas group-by scikit-learn

所以我有一些数据:

Epoch        Object User
1418409833   1      1
1418409834   1      2
1418409835   1234   1
1418409836   1234   1
1418409836   1589   2
1418409837   9      1
1418409838   9      2

如何将此帧转换为如此的numpy矩阵:

[ 1 2 0 1
  1 0 1 1]

每行是用户,每列是直方图bin值。 因此,在这种情况下,用户1具有2个对象1234的计数,因此第二个索引是2。

但请注意,此处用户2没有对象1234,因此在该对应列中需要0。

用例用于scikit-learn分类器。

1 个答案:

答案 0 :(得分:2)

您可以使用groupby按用户分组,value_counts计算直方图,unstack重新整形结果:

In [13]: df
Out[13]: 
        Epoch  Object  User
0  1418409833       1     1
1  1418409834       1     2
2  1418409835    1234     1
3  1418409836    1234     1
4  1418409836    1589     2
5  1418409837       9     1
6  1418409838       9     2

In [14]: df.groupby(['User'])['Object'].value_counts().unstack(level=1).fillna(0)
Out[14]: 
      1     9     1234  1589
User                        
1        1     1     2     0
2        1     1     0     1

然后,您可以访问values属性以获取NumPy数组:

In [15]: df.groupby(['User'])['Object'].value_counts().unstack(level=1).fillna(0).values
Out[15]: 
array([[ 1.,  1.,  2.,  0.],
       [ 1.,  1.,  0.,  1.]])