【问题标题】:How can I use cumsum skipping the first entry?如何使用 cumsum 跳过第一个条目?
【发布时间】:2020-11-10 04:31:46
【问题描述】:

我有一个 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 的结果所需的特殊顺序。 希望一切都清楚

【问题讨论】:

    标签: python pandas cumsum


    【解决方案1】:

    您可以使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-24
      • 2023-01-05
      • 2012-04-22
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      相关资源
      最近更新 更多