2 回答

TA貢獻(xiàn)1784條經(jīng)驗 獲得超8個贊
檢查使用groupbywithcumsum創(chuàng)建組的內(nèi)部密鑰,下一步我們True根據(jù) df 中的所有值進(jìn)行過濾,然后我們groupby使用新密鑰進(jìn)行另一輪first last,join結(jié)果
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貢獻(xiàn)2037條經(jīng)驗 獲得超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
一旦被轉(zhuǎn)移,您可以True在打開時按預(yù)期查詢
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
或者什么時候關(guān)閉
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
有人可能會爭辯說,這比另一個(非常好的)答案效率低,但更容易理解。
添加回答
舉報