【问题标题】:Pandas Groupby CumSum Only on Consecutive RowsPandas Groupby CumSum 仅在连续行上
【发布时间】:2020-06-17 00:59:00
【问题描述】:

我试图在 pandas 的 groupby 中获得累积和和计数,但前提是但仅限于连续行值。如果值不连续,我想累计和计数重置。

这些组按“ID”和“STATUS”排列,“DAYS”是求和的值。

我当前的数据集如下所示:

ID  DAYS  STATUS
MXD  31    Est
MXD  11    Est
MXD  29    RDDS
MXD  31    Est
------------------
NOA  28    Est
NOA  34    RDDS
NOA  27    Est
NOA  27    Est
------------------
TNT  34    RDDS
TNT  27    RDDS
TNT  27    Est
TNT  27    RDDS

我想要的数据集如下所示:

ID  DAYS  STATUS  CONSECT_ONLY_SUM CONSECT_ONLY_COUNT
MXD  31    Est          31                 1
MXD  11    Est          42                 2
MXD  29    RDDS         29                 1  - accumulative sum and count reset on new non-consect row
MXD  31    Est          31                 1
-------------------
NOA  28    Est          28                 1
NOA  34    RDDS         34                 1
NOA  27    Est          27                 1  - accumulative sum and count starts on consect "STATUS" rows
NOA  27    Est          54                 2
-------------------
TNT  34    RDDS         34                 1
TNT  27    RDDS         61                 2
TNT  27    Est          27                 1 - accumulative sum and count reset on new non-consect row
TNT  27    RDDS         27                 1

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas pandas-groupby cumsum


    【解决方案1】:

    我们需要使用shiftcumsum 创建子组键,然后我们使用cumsumcumcount。注意这里我使用的是pd.Serise groupby

    g=df['DAYS'].groupby([df['ID'],df.STATUS.ne(df.STATUS.shift()).cumsum()])
    df['SUMCOND']=g.cumsum()
    df['COUNTCOND']=g.cumcount()+1
    df
         ID  DAYS STATUS  SUMCOND  COUNTCOND
    0   MXD    31    Est       31          1
    1   MXD    11    Est       42          2
    2   MXD    29   RDDS       29          1
    3   MXD    31    Est       31          1
    4   NOA    28    Est       28          1
    5   NOA    34   RDDS       34          1
    6   NOA    27    Est       27          1
    7   NOA    27    Est       54          2
    8   TNT    34   RDDS       34          1
    9   TNT    27   RDDS       61          2
    10  TNT    27    Est       27          1
    11  TNT    27   RDDS       27          1
    

    【讨论】:

    • 这正是我想要的,谢谢@YOBEN_S!
    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多