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
有人可能會爭辯說,這比另一個(非常好的)答案效率低,但更容易理解。
添加回答
舉報