Python Groupby Запуск столбца Total / Cumsum на основе строки в другом столбце - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу создать 2 столбца промежуточного итога, которые ТОЛЬКО агрегируют значения Amount в зависимости от того, равно ли TYPE ANNUAL или MONTHLY в каждом Deal, так что это будет DF.groupby(['Deal','Booking Month']), затем каким-то образом примените суммуфункция, когда TYPE==ANNUAL для первого столбца и TYPE==MONTHLY для второго столбца.

Это если то, как выглядит мой сгруппированный DF + два желаемых столбца.

Deal  TYPE   Month   Amount     Running Total(ANNUAL)   Running Total(Monthly)
A    ANNUAL   April    1000       1000                    0
A    ANNUAL   April    2000       3000                    0
A    MONTHLY  June     1500       3000                   1500
B    MONTHLY  April    11150      0                      11150
B    ANNUAL   July     700        700                    11150
B    ANNUAL   August   303.63     1003.63                11150
C    ANNUAL   April    25624.59   25624.59                0
D    ANNUAL   June     5000       5000                    0
D    ANNUAL   July     5000       10000                   0
D    ANNUAL   August   5000       15000                   0
E    ANNUAL   April    10         10                      0
E    MONTHLY  May      1000       10                      1000
E    ANNUAL   May      500        510                     1000
E    MONTHLY  June     500.00     510                     1500
E    ANNUAL   June     600        1110                    1500
E    MONTHLY  July     300        1110                    1800
E    MONTHLY  July     8200       1110                    10000         

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вы можете сделать это с помощью .expanding.sum(), который будет поддерживать мультииндекс из групп, которые вы можете отложить, чтобы получить отдельные столбцы для каждого типа.Используйте другой groupby, чтобы заполнить пропущенные значения в каждой группе соответственно.Объединить это обратно.

Приятно то, что это можно сделать для произвольного числа типов без необходимости явно их определять где-либо.

import pandas as pd

df2 = (df.groupby(['Deal', 'TYPE'])
         .Amount.expanding().sum()
         .unstack(level=1)
         .groupby(level=0)
         .ffill().fillna(0)
         .reset_index(level=0, drop=True)
         .drop(columns='Deal'))

pd.concat([df, df2], axis=1)

Вывод

   Deal     TYPE   Month    Amount    ANNUAL  MONTHLY
0     A   ANNUAL   April   1000.00   1000.00      0.0
1     A   ANNUAL   April   2000.00   3000.00      0.0
2     A  MONTHLY    June   1500.00   3000.00   1500.0
3     B  MONTHLY   April  11150.00      0.00  11150.0
4     B   ANNUAL    July    700.00    700.00  11150.0
5     B   ANNUAL  August    303.63   1003.63  11150.0
6     C   ANNUAL   April  25624.59  25624.59      0.0
7     D   ANNUAL    June   5000.00   5000.00      0.0
8     D   ANNUAL    July   5000.00  10000.00      0.0
9     D   ANNUAL  August   5000.00  15000.00      0.0
10    E   ANNUAL   April     10.00     10.00      0.0
11    E  MONTHLY     May   1000.00     10.00   1000.0
12    E   ANNUAL     May    500.00    510.00   1000.0
13    E  MONTHLY    June    500.00    510.00   1500.0
14    E   ANNUAL    June    600.00   1110.00   1500.0
15    E  MONTHLY    July    300.00   1110.00   1800.0
16    E  MONTHLY    July   8200.00   1110.00  10000.0
0 голосов
/ 16 ноября 2018

Используйте filters и groupby + transform:

mask = df.TYPE.eq('ANNUAL')
cols = ['Running Total(ANNUAL)','Running Total(MONTHLY)']
df.loc[mask,'Running Total(ANNUAL)'] = df.loc[mask,'Amount']
df.loc[~mask,'Running Total(MONTHLY)'] = df.loc[~mask,'Amount']
df[cols] = df[cols].fillna(0)

df[cols] = df.groupby(['Deal'])['Running Total(ANNUAL)','Running Total(MONTHLY)'].transform('cumsum')

print(df)
   Deal     TYPE   Month    Amount  Running Total(ANNUAL)  \
0     A   ANNUAL   April   1000.00                1000.00   
1     A   ANNUAL   April   2000.00                3000.00   
2     A  MONTHLY    June   1500.00                3000.00   
3     B  MONTHLY   April  11150.00                   0.00   
4     B   ANNUAL    July    700.00                 700.00   
5     B   ANNUAL  August    303.63                1003.63   
6     C   ANNUAL   April  25624.59               25624.59   
7     D   ANNUAL    June   5000.00                5000.00   
8     D   ANNUAL    July   5000.00               10000.00   
9     D   ANNUAL  August   5000.00               15000.00   
10    E   ANNUAL   April     10.00                  10.00   
11    E  MONTHLY     May   1000.00                  10.00   
12    E   ANNUAL     May    500.00                 510.00   
13    E  MONTHLY    June    500.00                 510.00   
14    E   ANNUAL    June    600.00                1110.00   
15    E  MONTHLY    July    300.00                1110.00   
16    E  MONTHLY    July   8200.00                1110.00   

    Running Total(MONTHLY)  
0                      0.0  
1                      0.0  
2                   1500.0  
3                  11150.0  
4                  11150.0  
5                  11150.0  
6                      0.0  
7                      0.0  
8                      0.0  
9                      0.0  
10                     0.0  
11                  1000.0  
12                  1000.0  
13                  1500.0  
14                  1500.0  
15                  1800.0  
16                 10000.0  
...