如何使用cumsum跳过第一项?

问题描述

我有一个DF,其中包含某些项目的多个创建者的ID及其随时间推移的项目结果。 每个项目可以是成功(结果= 1)或失败(结果= 0)。 DF看起来像这样:

creator_id    outcome  
    1             1           
    1             1         
    2             1           
    2             0          
    2             1 

      

我正在寻找一种创建两个新列的方法:以前的项目和以前的成功。

一个应该是任何创建者以前项目的累计数量。鉴于我已经按创建者和创建日期订购了DF,我知道可以通过运行以下代码来做到这一点:

df['prev_project']=df.groupby(['creator_id']).cumcount()

我的问题是我无法弄清楚如何成功创建该列。 我尝试运行以下代码

df['prev_success']=df.groupby(['creator_id'])['outcome'].cumsum()

代码的问题在于它立即开始计数(x行的成功被视为x行项目的先前成功)。 而且,我对项目的结果路径不一致的项目有疑问,即一个创建者的顺序是:成功,失败,成功。

理想情况下,我的DF应该看起来像:

creator_id outcome  prev_projects  prev_success
1             1           0              0
1             1           1              1
2             1           0              0
2             0           1              1
2             1           2              1

请注意creator_id 2号结果所需的特殊顺序。 希望一切都清楚

解决方法

您可以将shiftfillna结合使用,以从0开始cumsum

df['outcome_shifted']=df.groupby(['creator_id'])['outcome'].shift().fillna(0)
df['prev_success']=df.groupby(['creator_id'])['outcome_shifted'].cumsum()
df

打印

creator_id  outcome prev_success    outcome_shifted
0   1       1       0.0             0.0
1   1       1       1.0             1.0
2   2       1       0.0             0.0
3   2       0       1.0             1.0
4   2       1       1.0             0.0