我有一个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分组,然后进行unstack,但我不是很确定具体应该怎么做。
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 10userID 1 1 NaN 1 0 0 12 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 9userID 1 1 NaN NaN NaN 1 0 NaN 0 NaN2 NaN NaN 1 NaN 1 0 NaN NaN NaN
注意:最初这个答案建议使用pivot_table
(它对重复值使用aggfunc,默认是平均值,这不是你在这里想要的 – 正如@U2EF1指出的),它在pivot之上提供了一些其他附加功能,但速度稍慢:
df.pivot_table(values='correct', rows='userID', cols='questionID')
我有种感觉,在pandas的旧版本中,pivot对NaN敏感,所以你必须使用pivot_table…