我有一个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()
感谢您的帮助。
答案 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 ......