如何在数据框python part2中创建累计和?

时间:2018-11-04 11:42:36

标签: python pandas

如何从表的需求列中的数据帧python中创建累积总和(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 :(得分:0)

由于上述数据没有可用于创建组的适当列,因此我们需要创建一个:

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)

创建grp_attr后,df如下所示:

   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)

答案 1 :(得分:0)

您可以在布尔掩码中更改条件,并在-中将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