获取multindex熊猫系列关卡中序列的第一个和最后一个元素

时间:2019-03-26 22:22:02

标签: python pandas dataframe series

我有一个系列,其状态可能为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

我想将某个情节中的状态开始为True以及停止为True时的日期提取到数据框。对于此示例,结果应该是这样的:

 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

2 个答案:

答案 0 :(得分:2)

使用groupbycumsum进行创建,以创建组的内部键,接下来,我们将基于df中的所有True值进行过滤,然后再进行一轮{{1} }与新密钥和groupby firstlast结果

join

答案 1 :(得分:1)

您还可以使用pandas.Series.shiftStatus列移动一。

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

一个人可能会说这比另一个(确实很好)的答案效率低,但更容易理解