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

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注