如何从需求列中在数据框python中创建累积总和(new_supply) 从表
item Date supply demand
A 2018-01-01 - 10
A 2018-01-02 - 15
A 2018-01-03 100 30
A 2018-01-04 - 10
A 2018-01-05 - 40
A 2018-01-06 50 50
A 2018-01-07 - 10
B 2018-01-01 - 20
B 2018-01-02 - 30
B 2018-01-03 20 60
B 2018-01-04 - 20
B 2018-01-05 100 10
B 2018-01-06 - 20
B 2018-01-07 - 30
上表中的新所需表
item Date supply demand new_supply
A 2018-01-01 - 10 -
A 2018-01-02 - 15 -
A 2018-01-03 100 30 55
A 2018-01-04 - 10 -
A 2018-01-05 - 40 -
A 2018-01-06 50 50 100
A 2018-01-07 - 10 -
B 2018-01-01 - 20 -
B 2018-01-02 - 30 -
B 2018-01-03 20 60 110
B 2018-01-04 - 20 -
B 2018-01-05 100 10 140
B 2018-01-06 - 20 -
B 2018-01-07 - 30 -
答案 0 :(得分:1)
我相信您需要DataFrameGroupBy.cumsum
和numpy.where
和isnumeric
来为列supply
的数字值设置新值:
m = df['supply'].str.isnumeric()
g = m.iloc[::-1].cumsum()
df['new'] = np.where(m, df.groupby(['item',g])['demand'].cumsum(), '-')
print (df)
item Date supply demand new
0 A 2018-01-01 - 10 -
1 A 2018-01-02 - 15 -
2 A 2018-01-03 100 30 55
3 A 2018-01-04 - 10 -
4 A 2018-01-05 - 40 -
5 A 2018-01-06 50 50 100
6 A 2018-01-07 - 10 -
7 B 2018-01-01 - 20 -
8 B 2018-01-02 - 30 -
9 B 2018-01-03 20 60 110
10 B 2018-01-04 - 20 -
11 B 2018-01-05 100 10 30
12 B 2018-01-06 - 20 -
13 B 2018-01-07 - 30 -
或者:
m = df['supply'].str.isnumeric()
df['new'] = np.where(m, df.groupby('item')['demand'].cumsum(), '-')
print (df)
item Date supply demand new
0 A 2018-01-01 - 10 -
1 A 2018-01-02 - 15 -
2 A 2018-01-03 100 30 55
3 A 2018-01-04 - 10 -
4 A 2018-01-05 - 40 -
5 A 2018-01-06 50 50 155
6 A 2018-01-07 - 10 -
7 B 2018-01-01 - 20 -
8 B 2018-01-02 - 30 -
9 B 2018-01-03 20 60 110
10 B 2018-01-04 - 20 -
11 B 2018-01-05 100 10 140
12 B 2018-01-06 - 20 -
13 B 2018-01-07 - 30 -
如果需要所有值:
df['new'] = df.groupby('item')['demand'].cumsum()
print (df)
item Date supply demand new
0 A 2018-01-01 - 10 10
1 A 2018-01-02 - 15 25
2 A 2018-01-03 100 30 55
3 A 2018-01-04 - 10 65
4 A 2018-01-05 - 40 105
5 A 2018-01-06 50 50 155
6 A 2018-01-07 - 10 165
7 B 2018-01-01 - 20 20
8 B 2018-01-02 - 30 50
9 B 2018-01-03 20 60 110
10 B 2018-01-04 - 20 130
11 B 2018-01-05 100 10 140
12 B 2018-01-06 - 20 160
13 B 2018-01-07 - 30 190
答案 1 :(得分:0)
简单地为:
df['new_supply'] = df.demand.cumsum()
当我们要查找列的累加总和时,上面的方法应该可以正常工作。 只需模拟您的DataFrame:
>>> df
item Date supply demand
0 A 2018-01-01 - 10
1 A 2018-01-02 - 15
2 A 2018-01-03 100 30
3 A 2018-01-04 - 10
4 A 2018-01-05 - 40
5 A 2018-01-06 50 50
6 A 2018-01-07 - 10
7 B 2018-01-01 - 20
8 B 2018-01-02 - 30
9 B 2018-01-03 20 60
10 B 2018-01-04 - 20
11 B 2018-01-05 100 10
12 B 2018-01-06 - 23
13 B 2018-01-07 - 30
因此,当我们执行df.<particulat_col>.cumsum()
时,将产生该值的cumsun,在我们的情况下,将带有以下新的所需列:
>>> df
item Date supply demand new_supply
0 A 2018-01-01 - 10 10
1 A 2018-01-02 - 15 25
2 A 2018-01-03 100 30 55
3 A 2018-01-04 - 10 65
4 A 2018-01-05 - 40 105
5 A 2018-01-06 50 50 155
6 A 2018-01-07 - 10 165
7 B 2018-01-01 - 20 185
8 B 2018-01-02 - 30 215
9 B 2018-01-03 20 60 275
10 B 2018-01-04 - 20 295
11 B 2018-01-05 100 10 305
12 B 2018-01-06 - 23 328
13 B 2018-01-07 - 30 358
如果确实我们正在寻找两项的总和或累积总和,则应与groupby
一起使用,如下所示:
>>> df['new_supply'] = df.groupby('item')['demand'].cumsum()
>>> df
item Date supply demand new_supply
0 A 2018-01-01 - 10 10
1 A 2018-01-02 - 15 25
2 A 2018-01-03 100 30 55
3 A 2018-01-04 - 10 65
4 A 2018-01-05 - 40 105
5 A 2018-01-06 50 50 155
6 A 2018-01-07 - 10 165
7 B 2018-01-01 - 20 20
8 B 2018-01-02 - 30 50
9 B 2018-01-03 20 60 110
10 B 2018-01-04 - 20 130
11 B 2018-01-05 100 10 140
12 B 2018-01-06 - 23 163
13 B 2018-01-07 - 30 193
注意: 如果需要所需的输出,则必须使用确实要过滤数据集的逻辑来修改问题!