#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 `