Как разделить данные из groupby на столбцы

#python #pandas

#питон #панды

Вопрос:

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

КОЭФФИЦИЕНТ РОЖДАЕМОСТИ Кредит ID
(339.999, 566.0] Плохой 9829
(339.999, 566.0] Хорошо 101495
(566.0, 788.0] Плохой 336
(566.0, 788.0] Хорошо 2345
(788.0, 1011.0] Плохой 1910
(788.0, 1011.0] Хорошо 24616

с кодом:

 df[['BIRTH_RATE', 'Credit','ID']].groupby(by=['BIRTH_RATE','Credit']).count()  

И я хотел бы разделить кредитную строку на столбцы

 (Credit Total = Good   Bad) (Bad rate = (Bad/Total)*100)  
КОЭФФИЦИЕНТ РОЖДАЕМОСТИ Итого по кредиту Плохой Хорошо Плохая ставка
(339.999, 566.0] 111324 9829 101495 8.8
(566.0, 788.0] 2681 336 2345 12.5
(788.0, 1011.0] 26526 1910 24616 7.2

Я попытался создать общую сумму кредита со следующим кодом

 df.groupby(["BIRTH_RATE"]).agg(Credit=('Credit', 'count'))  

Комментарии:

1. лучшая библиотека для обработки данных в python-это pandas. сообщество огромное и очень простое в использовании. попробуйте это с пандами

2. Вы ищете df.pivot , судя по всему.

3. @Corralien, вероятно, если он пропустит группу, верно

Ответ №1:

Используйте pivot для переформатирования фрейма данных и создания assign двух новых столбцов:

 out = df.pivot_table(values='ID', index='BIRTH_RATE', columns='Credit', aggfunc='sum')   .assign(**{'Credit Total': lambda x: x['Bad'] x['Good'],  'Bad Rate': lambda x: round(x['Bad']/(x['Bad'] x['Good'])*100, 1)})   .reset_index().rename_axis(columns=None) print(out)  # Output:  BIRTH_RATE Bad Good Credit Total Bad Rate 0 (339.999, 566.0] 9829 101495 111324 8.8 1 (566.0, 788.0] 336 2345 2681 12.5 2 (788.0, 1011.0] 1910 24616 26526 7.2  

Комментарии:

1. Я получил ошибку ValueError: Индекс содержит повторяющиеся записи, не может изменить форму

2. @mrsnoopy. Я обновил свое решение. Я заменил pivot на pivot_table и агрегировал с sum

3. Ошибка возникает из-за того, что у вас несколько одинаковых строк (КОЭФФИЦИЕНТ РОЖДАЕМОСТИ, Кредит). Вы должны принять решение, когда сталкиваетесь, например, с 2 рядами (339.999, 566.0], Bad

4. это работа! Спасибо. Я застрял с этой проблемой на несколько часов.

5. @mrsnoopy. Будьте осторожны, я решил использовать sum , но, может быть, вы хотите взять mean или first взять первое значение и т. Д.

Ответ №2:

Вот довольно простой способ сделать это. Получите свои хорошие/плохие столбцы с помощью простого разворота. Тогда очень легко вычислить остальное.

 df = df.pivot(index='BIRTH_RATE',columns='Credit',values='ID').reset_index().rename_axis(None,axis=1) df['Credit Total'] = df['Bad'] df['Good'] df['Bad Rate'] = (df['Bad']/df['Credit Total'])*100 print(df)  

Выход

 BIRTH_RATE Bad Good Credit Total Bad Rate 0 (339.999, 566.0] 9829 101495 111324 8.829183 1 (566.0, 788.0] 336 2345 2681 12.532637 2 (788.0, 1011.0] 1910 24616 26526 7.200483  

Комментарии:

1. Я пробовал использовать этот код, но получил следующий результат: ` Коэффициент рождаемости Плохой Хороший кредит Общая плохая ставка 0 (339.999, 566.0] 8.570451 e 09 8.570451 e 09 1.714108 e 10 49.999479 1 (566.0, 788.0] 8.570451 e 09 8.570451 e 09 1.714108 e 10 50.000147 2 (788.0, 1011.0] 8.570451 e 09 8.570451 e 09 1.714108 e 10 49.999728 `