为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

素胚勾勒不出你 2021-12-17 10:36:26
我有一个系列,它的状态可以是 True 或 False。它有一个 MultiIndex,第一级是 ID,第二级是每个 ID 中的一个剧集,第三级是记录状态的日期。ID  Episode Date        Statusfoo 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  Truebar 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-10bar 1       2019-03-04              2019-03-04    2       2019-03-05, 2019-03-08  2019-03-06, 2019-03-08
查看完整描述

2 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

检查使用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                   last

ID  Episode                                              

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

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

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

    2                   2019-02-05             2019-02-06

    3                   2019-02-09             2019-02-10


查看完整回答
反对 回复 2021-12-17
?
阿晨1998

TA贡献2037条经验 获得超6个赞

您也可以使用pandas.Series.shift将您的Status列移一位。


df['prev_Status'] = df['Status'].shift(1)

df['next_Status'] = df['Status'].shift(-1)


                    Status  prev_Status next_Status

Date            

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    True

2       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-08

foo  1    2019-02-02

     2    2019-02-05

     3    2019-02-09

Name: 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-08

foo  1               2019-02-03

     2               2019-02-06

     3               2019-02-10

Name: Date, dtype: object

有人可能会争辩说,这比另一个(非常好的)答案效率低,但更容易理解。


查看完整回答
反对 回复 2021-12-17
  • 2 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信