获取多索引熊猫系列级别内序列的第一个和最后一个元素

我有一个系列,它的状态可以是 True 或 False。它有一个 MultiIndex,第一级是 ID,第二级是每个 ID 中的一个剧集,第三级是记录状态的日期。


ID  Episode Date        Status

foo 1       2019-02-01  False

            2019-02-02  True

            2019-02-03  True

            2019-02-04  False

    2       2019-02-05  True

            2019-02-06  True

            2019-02-07  False

    3       2019-02-08  False

            2019-02-09  True

            2019-02-10  True

bar 1       2019-03-03  False

            2019-03-04  True

    2       2019-03-05  True

            2019-03-06  True

            2019-03-07  False

            2019-03-08  True

            2019-03-09  False

我想将一集中状态何时开始为真以及何时停止为真的日期提取到数据帧中。对于这个例子,结果应该是这样的:


 ID Episode Start Dates             End Dates       

foo 1       2019-02-02              2019-03-03          

    2       2019-02-05              2019-02-06  

    3       2019-02-09              2019-02-10

bar 1       2019-03-04              2019-03-04

    2       2019-03-05, 2019-03-08  2019-03-06, 2019-03-08


素胚勾勒不出你
浏览 180回答 2
2回答

青春有我

检查使用groupbywithcumsum创建组的内部密钥,下一步我们True根据 df 中的所有值进行过滤,然后我们groupby使用新密钥进行另一轮first last,join结果s=(~df.Status).groupby(level=['ID','Episode']).cumsum().reset_index()s[df.Status.values].groupby(['ID','Episode','Status'])['Date'].agg(['first','last']).groupby(level=[0,1]).agg(','.join)Out[104]:                              first                   lastID  Episode                                              bar 1                   2019-03-04             2019-03-04    2        2019-03-05,2019-03-08  2019-03-06,2019-03-08foo 1                   2019-02-02             2019-02-03    2                   2019-02-05             2019-02-06    3                   2019-02-09             2019-02-10

阿晨1998

您也可以使用pandas.Series.shift将您的Status列移一位。df['prev_Status'] = df['Status'].shift(1)df['next_Status'] = df['Status'].shift(-1)                    Status  prev_Status next_StatusDate            foo 1   2019-02-01  False   NaN     True        2019-02-02  True    False   True        2019-02-03  True    True    False        2019-02-04  False   True    True2       2019-02-05  True    False   True        2019-02-06  True    True    False一旦被转移,您可以True在打开时按预期查询df.query('prev_Status=="False"').query('Status=="True"').groupby(level=[0,1]).Date.agg(','.join)bar  1    2019-03-04     2    2019-03-08foo  1    2019-02-02     2    2019-02-05     3    2019-02-09Name: Date, dtype: object或者什么时候关闭df.query('Status=="True"').query('next_Status=="False"').groupby(level=[0,1]).Date.agg(','.join)bar  2    2019-03-06,2019-03-08foo  1               2019-02-03     2               2019-02-06     3               2019-02-10Name: Date, dtype: object有人可能会争辩说,这比另一个(非常好的)答案效率低,但更容易理解。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python