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