如何从表的需求列中的数据帧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
答案 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