问题描述
我有一个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号结果所需的特殊顺序。 希望一切都清楚
解决方法
您可以将shift
与fillna
结合使用,以从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