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

时间:2018-11-04 09:34:12

标签: python pandas

如何从需求列中在数据框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      -

2 个答案:

答案 0 :(得分:1)

我相信您需要DataFrameGroupBy.cumsumnumpy.whereisnumeric来为列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

注意: 如果需要所需的输出,则必须使用确实要过滤数据集的逻辑来修改问题!