【问题标题】:Pandas group by cumsum keep columnsPandas 按 cumsum 分组保持列
【发布时间】:2017-06-08 02:47:38
【问题描述】:

我现在花了几个小时尝试在 pandas 数据框上进行“按总和的累积分组”。我查看了所有 stackoverflow 的答案,令人惊讶的是没有一个可以解决我的(非常基本的)问题:

我有一个数据框:

df1 Out[8]: Name Date Amount 0 Jack 2016-01-31 10 1 Jack 2016-02-29 5 2 Jack 2016-02-29 8 3 Jill 2016-01-31 10 4 Jill 2016-02-29 5

我正在尝试

  1. 按 ['Name','Date'] 和
  2. 分组
  3. cumsum '金额'。
  4. 就是这样。

所以想要的输出是:

df1 Out[10]: Name Date Cumsum 0 Jack 2016-01-31 10 1 Jack 2016-02-29 23 2 Jill 2016-01-31 10 3 Jill 2016-02-29 15

编辑:我正在简化问题。使用当前的答案,我仍然无法获得正确的“正在运行”的 cumsum。仔细看,我想看累计和“10,23,10,15”。换句话说,我想在每个连续的日期查看一个人的总累计和。注意:如果同一个人在同一日期有两个条目,我想将它们相加,然后将它们添加到正在运行的 cumsum 中,然后才打印总和。

【问题讨论】:

    标签: pandas group-by cumsum


    【解决方案1】:

    先设置索引,再设置groupby。

    df.set_index(['Name', 'Date']).groupby(level=[0, 1]).Amount.cumsum().reset_index()
    


    在 OP 改变了他们的问题之后,现在这是正确的答案。

    df1.groupby(
        ['Name','Date']
    )Amount.sum().groupby(
        level='Name'
    ).cumsum()
    

    这与 jezrael 提供的答案相同

    【讨论】:

    • 感谢您的回复。根据我的编辑,您的解决方案没有提供所需的输出,但是我相信您已经提供了很好的指导。谢谢
    • 谁给了我反对票,请重新考虑,因为 OP 在给出答案后改变了他们的问题。我不想看起来复制 jezrael 的答案,所以我只是提到它。
    • 嗨 piRSquared,我投了反对票,因为您的代码没有达到原始所需的输出(甚至在编辑之前) - 所以至少不是一个赞成的恕我直言。但是事后看来,您确实提供了set_index,它解决了我的次要问题,所以我会投票。再次感谢
    • 感谢您的及时回复和帮助
    • 请注意:这为我解决了 cumsum() 不包括 groupby 列的问题。所以谢谢!
    【解决方案2】:

    您需要将输出分配给新列,然后通过drop 删除Amount 列:

    df1['Cumsum'] = df1.groupby(by=['Name','Date'])['Amount'].cumsum()
    df1 = df1.drop('Amount', axis=1)
    print (df1)
       Name        Date  Cumsum
    0  Jack  2016-01-31      10
    1  Jack  2016-02-29       5
    2  Jack  2016-02-29      13
    3  Jill  2016-01-31      10
    4  Jill  2016-02-29       5
    

    assign 的另一个解决方案:

    df1 = df1.assign(Cumsum=df1.groupby(by=['Name','Date'])['Amount'].cumsum())
             .drop('Amount', axis=1)
    print (df1)
       Name        Date  Cumsum
    0  Jack  2016-01-31      10
    1  Jack  2016-02-29       5
    2  Jack  2016-02-29      13
    3  Jill  2016-01-31      10
    4  Jill  2016-02-29       5
    

    通过评论编辑:

    首先groupbyNameDate 并聚合sum,然后groupby by level Name 和聚合cumsum

    df = df1.groupby(by=['Name','Date'])['Amount'].sum()
            .groupby(level='Name').cumsum().reset_index(name='Cumsum')
    print (df)
       Name        Date  Cumsum
    0  Jack  2016-01-31      10
    1  Jack  2016-02-29      23
    2  Jill  2016-01-31      10
    3  Jill  2016-02-29      15
    

    【讨论】:

    • 感谢您的回复,但是第二组应将 Jack 的多个 2016-02-29 金额汇总在一起。所以 Cumsum 必须只有四行读取“10、23、10、15”。不过,我会尽量使用您提供的内容,谢谢。
    猜你喜欢
    • 2022-01-18
    • 2021-03-25
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2019-10-31
    相关资源
    最近更新 更多