Как создать накопительную сумму в dataframe python part2? - PullRequest
0 голосов
/ 04 ноября 2018

Как создать накопительную сумму (new_supply) в питоне фрейма данных из столбца спроса из таблицы

item   Date       supply  demand
A     2018-01-01  0       10
A     2018-01-02  0       15
A     2018-01-03  100     30
A     2018-01-04  0       10
A     2018-01-05  0       40
A     2018-01-06  50      50
A     2018-01-07  0       10
B     2018-01-01  0       20
B     2018-01-02  0       30
B     2018-01-03  20      60
B     2018-01-04  0       20
B     2018-01-05  100     10
B     2018-01-06  0       20
B     2018-01-07  0       30

Новая желаемая таблица из приведенной выше таблицы

item   Date       supply  demand  new_supply
A     2018-01-01  0       10      0
A     2018-01-02  0       15      0
A     2018-01-03  100     30      55
A     2018-01-04  0       10      0
A     2018-01-05  0       40      0
A     2018-01-06  50      50      100
A     2018-01-07  0       10      0
B     2018-01-01  0       20      0
B     2018-01-02  0       30      0
B     2018-01-03  20      60      110
B     2018-01-04  0       20      0
B     2018-01-05  100     10      140
B     2018-01-06  0       20      0
B     2018-01-07  0       30      0

Ответы [ 2 ]

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

Вы можете изменить условие в логической маске и изменить - на 0 в np.where:

m = df['supply'] != 0

df['new'] = np.where(m, df.groupby('item')['demand'].cumsum(), 0)
print (df)
   item        Date  supply  demand  new
0     A  2018-01-01       0      10    0
1     A  2018-01-02       0      15    0
2     A  2018-01-03     100      30   55
3     A  2018-01-04       0      10    0
4     A  2018-01-05       0      40    0
5     A  2018-01-06      50      50  155
6     A  2018-01-07       0      10    0
7     B  2018-01-01       0      20    0
8     B  2018-01-02       0      30    0
9     B  2018-01-03      20      60  110
10    B  2018-01-04       0      20    0
11    B  2018-01-05     100      10  140
12    B  2018-01-06       0      20    0
13    B  2018-01-07       0      30    0
0 голосов
/ 04 ноября 2018

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

df['grp_attr'] = df['supply'].clip(upper=1)
df['grp_attr'] = df[df['grp_attr'] != 0]['grp_attr'].cumsum()
df['grp_attr'] = df['grp_attr'].bfill().fillna(0).astype(int)

df выглядит так, как только вы создаете grp_attr:

   item        Date  supply  demand  grp_attr
0     A  2018-01-01       0      10         1
1     A  2018-01-02       0      15         1
2     A  2018-01-03     100      30         1
3     A  2018-01-04       0      10         2
4     A  2018-01-05       0      40         2
5     A  2018-01-06      50      50         2
6     A  2018-01-07       0      10         3
7     B  2018-01-01       0      20         3
8     B  2018-01-02       0      30         3
9     B  2018-01-03      20      60         3
10    B  2018-01-04       0      20         4
11    B  2018-01-05     100      10         4
12    B  2018-01-06       0      20         0
13    B  2018-01-07       0      30         0`

Теперь мы можем группировать, используя grp_attr:

df['new_supply'] = df.groupby('grp_attr')['demand'].cumsum()
df.loc[df['supply'] == 0, 'new_supply'] = 0

Когда вы закончите свои операции, теперь вы можете удалить столбцы grp_attr из вашего фрейма данных.

df.drop(columns=['grp_attr'], inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...