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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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