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
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
有人可能会争辩说,这比另一个(非常好的)答案效率低,但更容易理解。
添加回答
举报