亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取多索引熊貓系列級別內序列的第一個和最后一個元素

獲取多索引熊貓系列級別內序列的第一個和最后一個元素

素胚勾勒不出你 2021-12-17 10:36:26
我有一個系列,它的狀態可以是 True 或 False。它有一個 MultiIndex,第一級是 ID,第二級是每個 ID 中的一個劇集,第三級是記錄狀態的日期。ID  Episode Date        Statusfoo 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  Truebar 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我想將一集中狀態何時開始為真以及何時停止為真的日期提取到數據幀中。對于這個例子,結果應該是這樣的: 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-10bar 1       2019-03-04              2019-03-04    2       2019-03-05, 2019-03-08  2019-03-06, 2019-03-08
查看完整描述

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


查看完整回答
反對 回復 2021-12-17
?
阿晨1998

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

有人可能會爭辯說,這比另一個(非常好的)答案效率低,但更容易理解。


查看完整回答
反對 回復 2021-12-17
  • 2 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號