Агрегировать данный фрейм данных на основе конкретных условий в pandas

#python-3.x #pandas #pandas-groupby

#python-3.x #pandas #pandas-groupby

Вопрос:

У меня есть df, как показано ниже df:

 ID    Number_of_Cars    Age_in_days   Total_amount   Total_N     Type
1     2                 100           10000          100         A
2     5                 10            1000           2           B
3     1                 1000          1000           200         B
4     1                 20            0              0           C
5     3                 1000          100000         20          A
6     6                 100           10000          20          C
7     4                 200           10000          200         A
 

из приведенного выше df я хотел бы подготовить df1, как показано ниже

df1:

 ID    Avg_Monthly_Amount      Avg_Monthly_N  Type
1     3000                    30             A
2     3000                    6              B
3     30                      6              B
4     0                       0              C
5     3000                    0.6            A
6     3000                    6              C
7     1500                    30             A
 

Объяснение:

 Avg_Monthly_Amount = Avg monthly amount 
Avg_Monthly_N = Avg monthly N
 

Чтобы подготовить df1, я попробовал приведенный ниже код

 df['Avg_Monthly_Amount'] = df['Total_amount'] / df['Age_in_days'] * 30
df['Avg_Monthly_N'] = df['Total_N'] / df['Age_in_days'] * 30
 

Из df и df1 (или только из df) Я хотел бы подготовить приведенный ниже фрейм данных как df2

Я не мог написать правильный код для генерации ниже df2

Объяснение:

Агрегировать указанное выше число на уровне типа

Пример:

 There are 3 customers (ID = 1, 5, 7) with Type = A, hence for Type = A, Number_Of_Type  = 3
Avg_Cars for Type = A, is (2 3 4)/3 = 3
Avg_age_in_years for Type = A is ((100 1000 200)/3)/365
Avg_amount_monthly for Type = A is Mean of Average_Monthly_Amount in for type = A in df1 
Avg_N_monthly for Type = A is Mean of Avg_Monthly_N in for type = A in df1 
 

Конечный ожидаемый результат (df2)

 Type  Number_Of_Type  Avg_Cars     Avg_age_in_years   Avg_amount_monthly    Avg_N_monthly
A     3               3            1.19               2500                  20.2
B     2               3            1.38               1515                  6
C     2               3.5          0.16               1500                  3
 

Ответ №1:

Не подготавливайте другие df имена df1 из вашего исходного фрейма данных df

ваш фрейм данных df :-

 ID    Number_of_Cars    Age_in_days   Total_amount   Total_N     Type
1     2                 100           10000          100         A
2     5                 10            1000           2           B
3     1                 1000          1000           200         B
4     1                 20            0              0           C
5     3                 1000          100000         20          A
6     6                 100           10000          20          C
7     4                 200           10000          200         A
 

После создания / импорта df :-

 df['Avg_Monthly_Amount'] = df['Total_amount'] / df['Age_in_days'] * 30
df['Avg_Monthly_N'] = df['Total_N'] / df['Age_in_days'] * 30
df['Age_in_year']=df['Age_in_days']/365
 

Затем:-

 df2=df.groupby('Type').agg({'Type':'count','Number_of_Cars':'mean','Age_in_year':'mean','Avg_Monthly_Amount':'mean','Avg_Monthly_N':'mean'}).rename(columns={'Type':'Number_Of_Type'})
 

Теперь, если вы печатаете или записываете df2 (если вы используете jupyter notebook), вы получите желаемый результат

Вывод:-

     Number_Of_Type  Number_of_Cars  Age_in_year     Avg_Monthly_Amount  Avg_Monthly_N
Type                    
A             3           3.0        1.187215          2500.0             20.2
B             2           3.0        1.383562          1515.0             6.0
C             2           3.5        0.164384          1500.0             3.0
 

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

1. Не могли бы вы поделиться своими выводами

2. конечно… Я отредактировал свой ответ, просто взгляните ……. кстати, если это решение поможет вам, тогда не стесняйтесь принять ответ