我有一个系列,其状态可能为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
答案 0 :(得分:2)
使用groupby
和cumsum
进行创建,以创建组的内部键,接下来,我们将基于df中的所有True
值进行过滤,然后再进行一轮{{1} }与新密钥和groupby
first
,last
结果
join
答案 1 :(得分:1)
您还可以使用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
一个人可能会说这比另一个(确实很好)的答案效率低,但更容易理解。