2014-06-27 4 views
3

У меня есть кадр данных pandas, отображающий производительность пользователей по тестовым вопросам. Это выглядит следующим образом:pandas: groupby и unstack для создания вектор-функции для классификации

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() 

Благодарим за помощь.

ответ

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') 

у меня такое чувство, что в более старых версиях панды, стержень был чувствителен к NaN, так что вы должны были использовать pivot_table ...

+0

@ user3591836 Обратите внимание, что это собирается в среднем столбец «правильный», поэтому убедитесь, что пары (userID, questionID) уникальны! – U2EF1

+0

@ U2EF1 отличная точка, возможно, «поворот» - это правильная функция для использования здесь (по моему опыту это немного более чувствительно, хотя) ... Я был удивлен, что он позволяет NaN! –

+0

'df.pivot (index = 'userID', columns = 'questionID')' делает то же самое, оба работают нормально. И панда пытается быть дружественным НАN повсюду :) – U2EF1

Смежные вопросы