рассчитать сумму расходов на основе каждого месяца, который зависит от другого значения столбца ID - PullRequest
1 голос
/ 20 января 2020

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

Набор данных:

ID  TYPE_ID Month_year  Amount
100 1   jun_2019    20
100 1   jul_2019    30
100 2   jun_2019    10
200 1   jun_2019    50
200 1   jun_2019    30
100 2   jul_2019    20
200 2   jun_2019    40
200 2   jul_2019    10
200 2   jun_2019    20
200 1   jul_2019    30
100 1   jul_2019    10

Вывод: на основе каждого идентификатора типа я хочу вычислить тратить в зависимости от месяца. Значение столбца TYPEID_1_jun2019 сообщает мне количество транзакций, совершенных в этот конкретный месяц. Amount_type1_jun2019 сообщает мне общую сумму расходов за каждый месяц на основе моего идентификатора типа.

ID  TYPEID_1_jun2019    Amount_type1_jun2019    TYPEID_1_jul2019    Amount_type1_jul2019    TYPEID_2_jun2019    Amount_type2_jun2019    TYPEID_2_jul2019    Amount_type2_jul2019
100 1   20  2   40  1   10  1   20
200 1   80  1   30  2   60  1   10

РЕДАКТИРОВАТЬ: Я также хочу рассчитать среднемесячные расходы на каждый идентификатор

Вывод: также включите эти столбцы,

ID      Average_type1_jul2019   Average_type1_jun2019

100              20                        10

Формула, которую я использовал для расчета среднего значения, составляет amount spent in july with type ID 1 divided by the total months.

1 Ответ

2 голосов
/ 20 января 2020

Сначала преобразуйте Month_year в дату и время для правильного порядка, затем создайте вспомогательный столбец type и агрегируйте sum с size, измените его на DataFrame.unstack, отсортировав по DataFrame.sort_index и последнее выравнивание MultiIndex с указанием даты и времени в исходном формате:

df['Month_year'] = pd.to_datetime(df['Month_year'], format='%b_%Y')
df1 = (df.assign(type=df['TYPE_ID']).groupby(['ID','Month_year','TYPE_ID'])
        .agg({'Amount':'sum', 'type':'size'})
        .unstack([1,2])
        .sort_index(axis=1, level=[1,2]))

df1.columns = df1.columns.map(lambda x: f'{x[0]}_{x[2]}_{x[1].strftime("%b_%Y")}')
df1 = df1.reset_index()
print (df1)
    ID  Amount_1_Jun_2019  type_1_Jun_2019  Amount_2_Jun_2019  \
0  100                 20                1                 10   
1  200                 80                2                 60   

   type_2_Jun_2019  Amount_1_Jul_2019  type_1_Jul_2019  Amount_2_Jul_2019  \
0                1                 40                2                 20   
1                2                 30                1                 10   

   type_2_Jul_2019  
0                1  
1                1  

РЕДАКТИРОВАНИЕ:

#removed sorting anf flatteting MultiIndex
df['Month_year'] = pd.to_datetime(df['Month_year'], format='%b_%Y')
df1 = (df.assign(type=df['TYPE_ID']).groupby(['ID','Month_year','TYPE_ID'])
        .agg({'Amount':'sum', 'type':'size'})
        .unstack([1,2]))
print (df1)
               Amount                          type                 
Month_year 2019-06-01     2019-07-01     2019-06-01    2019-07-01   
TYPE_ID             1   2          1   2          1  2          1  2
ID                                                                  
100                20  10         40  20          1  1          2  1
200                80  60         30  10          2  2          1  1

#get number of unique mmonth_year per ID and type and divided by Amount
df2 = df.groupby(['ID','TYPE_ID'])['Month_year'].nunique().unstack()
df3 = df1.xs('Amount', axis=1, level=0).div(df2, level=1)
#added top level Average
df3.columns = pd.MultiIndex.from_tuples([('Average', a, b) for a, b in df3.columns])
print (df3)
       Average                       
    2019-06-01       2019-07-01      
             1     2          1     2
ID                                   
100       10.0   5.0       20.0  10.0
200       40.0  30.0       15.0   5.0

#join together, sorting and flatten MultiIndex
df5 = pd.concat([df1, df3],axis=1).sort_index(axis=1, level=[1,2])
df5.columns = df5.columns.map(lambda x: f'{x[0]}_{x[2]}_{x[1].strftime("%b_%Y")}')
df5 = df5.reset_index()
print (df5)
    ID  Amount_1_Jun_2019  Average_1_Jun_2019  type_1_Jun_2019  \
0  100                 20                10.0                1   
1  200                 80                40.0                2   

   Amount_2_Jun_2019  Average_2_Jun_2019  type_2_Jun_2019  Amount_1_Jul_2019  \
0                 10                 5.0                1                 40   
1                 60                30.0                2                 30   

   Average_1_Jul_2019  type_1_Jul_2019  Amount_2_Jul_2019  Average_2_Jul_2019  \
0                20.0                2                 20                10.0   
1                15.0                1                 10                 5.0   

   type_2_Jul_2019  
0                1  
1                1  
...