Дублирование результатов из функции, примененной к фрейму данных с помощью groupby

#python #pandas #function #dataframe #analysis

#python #pandas #функция #фрейм данных #анализ

Вопрос:

Я пытаюсь рассчитать процент групп с доходами, которые находятся в долгу, по сравнению с общим количеством людей в этих группах доходов (в долг = 1, без долга = 0) Я также пробовал метод groupby(), но не смог заставить его работать. Это то, что я набрал:

 import pandas as pd
import numpy as np
credit_scoring = pd.read_csv('/datasets/credit_scoring_eng.csv')

in_debt = credit_scoring[credit_scoring['debt'] == 1]['income_group'].value_counts()
total = credit_scoring['income_group'].value_counts()
print(in_debt)
print(total)

def percentage_of_debt(incomegroup):
    calc = in_debt / total * 100
    return calc

credit_scoring.groupby('income_group')['debt'].apply(percentage_of_debt)
 

Результат показывает правильные проценты, но он также снова группирует результат по группам доходов:

 < 20000          608
25000 - 29999    409
>= 35000         290
20000 - 24999    288
30000 - 34999    146
Name: income_group, dtype: int64
< 20000          7369
25000 - 29999    4856
>= 35000         4071
20000 - 24999    3378
30000 - 34999    1851
Name: income_group, dtype: int64
income_group                
20000 - 24999  < 20000          8.250780
               25000 - 29999    8.422570
               >= 35000         7.123557
               20000 - 24999    8.525755
               30000 - 34999    7.887628
                                  ...   
>= 35000       < 20000          8.250780
               25000 - 29999    8.422570
               >= 35000         7.123557
               20000 - 24999    8.525755
               30000 - 34999    7.887628
Name: debt, Length: 25, dtype: float64
 

Я хотел бы, чтобы вывод отображал:

 < 20000          8.250780
25000 - 29999    8.422570
20000 - 24999    8.525755
30000 - 34999    7.887628
>= 35000         7.123557
 

Ценю все предложения и рекомендации!

Ответ №1:

без базовой таблицы это немного сложно, но я думаю, что то, что вы хотите, это

 credit_scoring.groupby("income_group").agg(lambda df: 100 * df['debt'].sum() / df['debt'].count()).sort_index()
 

Это то, что вам нужно?