【问题标题】:pandas: groupby and unstack to create feature vector for classificationpandas:groupby 和 unstack 创建用于分类的特征向量
【发布时间】:2014-08-18 02:48:08
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

    标签: python pandas machine-learning


    【解决方案1】:

    你正在寻找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...

    【讨论】:

    • @user3591836 请注意,这将平均 correct 列,因此请确保 (userID, questionID) 对是唯一的!
    • @U2EF1 很好,也许pivot 是在这里使用的正确函数(根据我的经验,它有点敏感)......我很惊讶它允许 NaN!
    • df.pivot(index='userID', columns='questionID') 做同样的事情,都可以正常工作。 Pandas 试图在所有地方都对 NaN 友好:)
    • @U2EF1 我有这种感觉,枢轴使用不能很好地处理丢失的数据,但也许我正在弥补。谢谢,更新了答案(这里的支点肯定是正确的)
    猜你喜欢
    • 2015-03-20
    • 2017-09-04
    • 2017-02-21
    • 2022-06-14
    • 2016-02-25
    • 1970-01-01
    • 2019-08-01
    • 2017-10-05
    • 2020-07-08
    相关资源
    最近更新 更多