pandas:groupby和unstack创建用于分类的特征向量

时间:2014-06-27 04:59:27

标签: python pandas machine-learning

我有一个pandas数据框,显示用户在测试问题上的表现。它看起来像这样:

userID     questionID   correct
-------------------------------
  1             1          1
  1             5          1
  1             6          0
  1             8          0
  1             10         1
  2             3          1
  2             5          1
  2             6          0
  .             .          .
  .             .          .
  .             .          .   

我想为每个用户制作一个功能向量,说明他们是否正确地提出了每个问题,看起来像这样:

questionID     1     2      3     4     5     6     ...
userID       -------------------------------------------------
  1            1    NaN   NaN    NaN    1     0     ...
  2           NaN   NaN    1     NaN    1     0     ...
  .           ...
  .           ...
  .            

每个用户只会显示所有问题的子集,因此它是一个稀疏矩阵。

如何在熊猫中制作上表?

我想做类似下面的事情 - 按userID和questionID分组然后取消堆栈,但我不确定它应该如何运作。

df = df.groupby(['user_id','question_id'])
df.unstack()

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

您正在寻找pivot

In [11]: df.pivot(values='correct', index='userID', columns='questionID')
Out[11]: 
questionID  1   3   5   6   8   10
userID                            
1            1 NaN   1   0   0   1
2          NaN   1   1   0 NaN NaN

如果你不满足,你可能想重新索引列(基于所有问题)。

In [12]: _.reindex_axis(np.arange(1, 10), 1)
Out[12]: 
         1   2   3   4  5  6   7   8   9
userID                                  
1        1 NaN NaN NaN  1  0 NaN   0 NaN
2      NaN NaN   1 NaN  1  0 NaN NaN NaN

注意:最初这个答案建议pivot_table(在重复值上使用aggfunc,默认情况下,这并不是你想要的 - 正如@ U2EF1指出的那样),它提供了一些其他的附加功能。但是有点慢:

df.pivot_table(values='correct', rows='userID', cols='questionID')

我有这种感觉,在旧版本的pandas中,pivot对NaN很敏感所以你必须使用pivot_table ......