pandas создать столбец как запаздывающую разницу двух других столбцов, сгруппированных по ключу - PullRequest
0 голосов
/ 07 мая 2020

У меня есть следующий фрейм данных (df)


                       AmountNeeded         AmountAvailable
Source Target                                              
1      2                      290.0                   600.0
       4                      300.0                   600.0
       6                      200.0                   600.0
3      2                      290.0                   450.0
       5                      100.0                   450.0 
7      8                        0.0                   500.0

Я хотел бы вычислить оставшуюся доступность для каждого источника :


                       AmountNeeded    AmountAvailable       RemainingAvailability
Source Target                                              
1      2                      290.0             600.0                          600
       4                      300.0             600.0                          310
       6                      200.0             600.0                           10
3      2                      290.0             450.0                          450
       5                      100.0             450.0                          160
7      8                        0.0             500.0                          500

Итак, если Source появляется более одного раза, мне нужно вычесть сумму запаздывающих значений AmountNeeded для этого конкретного Source.
Если мы возьмем Source 1 и Target 4, оставшаяся сумма должна быть AmountAvailable-AmountNeeded(previous_row) = 600 - 290 = 310
Если мы перейдем к Source 1 и Target 6, это будет: 600 - (290+300) = 10.
Это также будет вычислено как RemainingAvailability - AmountNeeded = 310 - 300 = 10

Я пытался использовать разные комбинации groupby и diff, но без особого успеха.

1 Ответ

1 голос
/ 07 мая 2020

Используйте Series.sub с серией помощников, созданной лямбда-функцией с Series.shift и совокупной суммой Series.cumsum:

s = df.groupby(level=0)['AmountNeeded'].apply(lambda x: x.shift(fill_value=0).cumsum())
df['RemainingAvailability'] = df['AmountAvailable'].sub(s)
print (df)

               AmountNeeded  AmountAvailable  RemainingAvailability
Source Target                                                      
1      2              290.0            600.0                  600.0
       4              300.0            600.0                  310.0
       6              200.0            600.0                   10.0
3      2              290.0            450.0                  450.0
       5              100.0            450.0                  160.0
7      8                0.0            500.0                  500.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...