Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于另一列重置累积和_Python_Pandas_Cumulative Sum - Fatal编程技术网

Python 基于另一列重置累积和

Python 基于另一列重置累积和,python,pandas,cumulative-sum,Python,Pandas,Cumulative Sum,有许多与条件累积和(,)相关的查询和回答。但我无法解决我面临的问题。以下是我拥有的部分数据,要求记录“类型”的变化和相应的累计金额 type sale y 10 y 20 y 5 n 30 n 20 n 5 y 10 y 40 y 15 我的要求是得到一个类型和累计销售变化的序列计数,如下所示 type sale tp_

有许多与条件累积和(,)相关的查询和回答。但我无法解决我面临的问题。以下是我拥有的部分数据,要求记录“类型”的变化和相应的累计金额

  type sale
    y   10   
    y   20   
    y    5   
    n   30   
    n   20   
    n    5   
    y   10   
    y   40   
    y   15   
我的要求是得到一个类型和累计销售变化的序列计数,如下所示

   type sale tp_cum cum_sale
    y   10    1      10
    y   20    1      30
    y    5    1      35
    n   30    2      30
    n   20    2      50 
    n    5    2      55
    y   10    3      10
    y   40    3      50
    y   15    3      65
我尝试了以下代码的各种修改,但并不完全符合要求。请帮忙

sales['cum_sale'] = stock.groupby('type')['sale'].cumsum()
数据帧:

df = pd.DataFrame([["y",10 ], 
["y",20  ],
["y",5  ],
["n",30   ],
["n",20   ],
["n",5 ],
["y",10  ], 
["y",40  ],
["y",15 ]],columns = ["type","sale"])

这里有一个选项,您首先创建
tp_cum
列,然后创建
cumsum()

输出:

    type    sale    type2  cum_sale
0   y       10      1      10
1   y       20      1      30
2   y       5       1      35
3   n       30      2      30
4   n       20      2      50
5   n       5       2      55
6   y       10      3      10
7   y       40      3      50
8   y       15      3      65

我假设在行上循环效率太低,或者有其他原因反对这样做?您也可以,
df.groupby((df.type!=df.type.shift(1)).cumsum())['sale'].cumsum()
    type    sale    type2  cum_sale
0   y       10      1      10
1   y       20      1      30
2   y       5       1      35
3   n       30      2      30
4   n       20      2      50
5   n       5       2      55
6   y       10      3      10
7   y       40      3      50
8   y       15      3      65