熊猫:分组和解栈来创建分类的特征向量



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

每个用户只得到所有问题的一个子集,所以它是一个稀疏矩阵。

如何用pandas制作上面的表格?

我想做一些像下面-分组userID和questionID,然后解除堆叠,但我不确定它应该如何工作。

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

谢谢你的帮助。

您要找的是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…

最新更新