Создание сводной таблицы на групповом фрейме данных на основе условия - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть pf для данных pandas df, который выглядит как

userid  trip_id segmentid   actual  prediction
  1       13       40          3       3
  1       6        2           1       1
  1       44       3           2       3
  2       70       19          1       1
  2       12       5           0       0

Мне нужно создать итоговый кадр данных dfsummary, сгруппированный по столбцу ID пользователя , имеющий три столбца: идентификатор пользователя, правильный_классифицированный, неверный_классифицированный.Если фактические и прогнозные значения одинаковы, то они классифицируются правильно, иначе классифицируются некорректно.

Я могу посчитать correct_classfied на всем фрейме данных как

correct_classified = submission[(submission['Actual'] == submission['prediction'])]
incorrect_classified = submission[(submission['Actual'] != submission['prediction'])]

, но у меня нет идеи создать сводную таблицу, сгруппированную по идентификатору пользователя, которая должна выглядеть следующим образом

userid  correct_classified  incorrect_classified
  1             2                    1
  2             2                    0

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Вы также можете использовать pivot table т.е.

m = df['actual']==df['prediction']

# assign the conditions to new columns and aggregate.  
df.assign(correct_classified=m,incorrect_classified=~m).pivot_table(index='userid',
                                                                    aggfunc='sum',
                                                                    values=['correct_classified',
                                                                            'incorrect_classified'])

Выход:

     correct_classified  incorrect_classified
userid                                          
1                      2.0                   1.0
2                      2.0                   0.0
0 голосов
/ 30 сентября 2018

Вы можете использовать pd.crosstab после создания условного массива:

flags = np.where(df['actual'].eq(df['prediction']), 'correct', 'incorrect')

res = pd.crosstab(df['userid'], flags)

print(res)

col_0   correct  incorrect
userid                    
1             2          1
2             2          0
...