Как выполнить группировку по обработке, накопленным суммам и предыдущей строке в текущей строке в Python? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть следующие данные:

df1 = pd.DataFrame({'AIRPORT': ['ORD','ORD','ORD','ORD','ORD','DCA','DCA','DCA','DCA','DCA','DCA','DCA'],
                    'MONTH': [3,4,5,6,7,1,2,3,4,5,6,7],
                    'VOLUME': [200, 500, 600, 900, 400, 44, 55, 66, 77, 88, 99, 77],
                    'MULT': [2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 7, 8]})

Содержит две группы аэропортов ORD и DCA.

По группам и только для не первой строки групп я хочу создать три новые переменные:

TRY1 : это предыдущие месяцы VOLUME / предыдущие месяцы MULT
Выяснено решение:

# TRY1
df['MULTIPLY'] = df['VOLUME']/df['MULT']
df['TRY1'] = df.groupby(['AIRPORT'])['MULTIPLY'].shift(1)

TRY2 : Это накопленная сумма ОБЪЕМА за последние 2 месяца и ОБЪЕМА текущего месяца, если МЕСЯЦ> = 6 Вычислено решение:

# TRY2
df['TRY2'] = \
        np.where( df['MONTH'] >= 6
                 ,pd.rolling_sum(df['VOLUME'], window=3).fillna(0)
                 ,np.nan)

TRY3 : Это предыдущие месяцы ОБЪЕМ * текущие месяцы MULT
Выяснилось Решение:

# TRY3
df['TRY3'] = df.groupby(['AIRPORT'])['VOLUME'].shift(1) *  df['MULT']

Данные о результатах:

AIRPORT MONTH   VOLUME  MULT     TRY1                  TRY2          TRY3
ORD     3         200   2           
ORD     4         500   3     100.0(200/2)                         600(200*3)
ORD     5         600   4     166.7(500/3)                         2000(500*4)
ORD     6         900   5     150.0(600/4)  2000(500+600+900)       3000(600*5)
ORD     7         400   6     180.0(900/5)  1900(600+900+400)       5400(900*6)
DCA     1         44    2           
DCA     2         55    3      22.0(44/2)                              132
DCA     3         66    4      18.3(55/3)                              220
DCA     4         77    5      16.5(66/4)                              330
DCA     5         88    6      15.4(77/5)                              462
DCA     6         99    7      14.7(88/6)       264 (77+88+99)         616
DCA     7         77    8      14.1(99/7)       264 (88+99+77)         792

Любые идеи будут высоко оценены. Спасибо.

1 Ответ

0 голосов
/ 26 марта 2020
df = pd.DataFrame({'AIRPORT': ['ORD','ORD','ORD','ORD','ORD','DCA','DCA','DCA','DCA','DCA','DCA','DCA'],
                    'MONTH': [3,4,5,6,7,1,2,3,4,5,6,7],
                    'VOLUME': [200, 500, 600, 900, 400, 44, 55, 66, 77, 88, 99, 77],
                    'MULT': [2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 7, 8]})

# TRY1
df['MULTIPLY'] = df['VOLUME']/df['MULT']
df['TRY1'] = df.groupby(['AIRPORT'])['MULTIPLY'].shift(1)

# TRY2
df['TRY2'] = \
        np.where( df['MONTH'] >= 6
                 ,pd.rolling_sum(df['VOLUME'], window=3).fillna(0)
                 ,np.nan)
# TRY3
df['TRY3'] = df.groupby(['AIRPORT'])['VOLUME'].shift(1) *  df['MULT']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...