2 回答

TA貢獻1860條經(jīng)驗 獲得超9個贊
使用melt了重塑第一,然后創(chuàng)建幫手唯一的組列通過cumsum,過濾器只有True人民共同boolean indexing和聚合agg的功能first和last:
df = df.rename_axis('date').reset_index().melt('date', var_name='ind', value_name='boolean')
df['new'] = (~df['boolean']).cumsum()
df = (df[df['boolean']]
.groupby('new')
.agg({'date':['first','last'], 'ind':'first'})
.reset_index(drop=True))
df.columns = df.columns.map('_'.join)
print (df)
date_first date_last ind_first
0 2018-01-03 2018-01-05 indic_A
1 2018-01-09 2018-01-09 indic_A
2 2018-01-12 2018-01-15 indic_A
3 2018-01-09 2018-01-13 indic_B

TA貢獻1859條經(jīng)驗 獲得超6個贊
你可以試試 pd.DataFrame.shift
首先制作2個新的上下移位列
df['down_shift'] = df['indic'].shift()
df['up_shift'] = df['indic'].shift(-1)
并且df會像
indic down_shift up_shift
2018-01-01 False NaN False
2018-01-02 False False True
2018-01-03 True False True
2018-01-04 True True True
2018-01-05 True True False
2018-01-06 False True False
2018-01-07 False False False
2018-01-08 False False True
2018-01-09 True False False
2018-01-10 False True False
2018-01-11 False False True
2018-01-12 True False True
2018-01-13 True True True
2018-01-14 True True True
2018-01-15 True True NaN
這里的想法是
情況 1: (indic, down_shift) = (True, False) - 開始
情況 2: (indic, up_shift) = (True, False) - 結(jié)束
情況 3:情況 1 和情況 2 都發(fā)生 - 開始和結(jié)束
所以我們使用技巧
真 - 假 = 1
假 - 真 = -1
真 - 真 = 0
假 - 假 = 0
代碼:
case_start = df['indic'] - df['down_shift']
case_end = df['indic'] - df['up_shift']
start_date_list = df[case_start == 1].index
end_date_list = df[case_end == 1].index
然后我們檢查 start_date_list
DatetimeIndex(['2018-01-03', '2018-01-09', '2018-01-12'], dtype='datetime64[ns]', freq=None)
然后我們檢查 end_date_list
DatetimeIndex(['2018-01-05', '2018-01-09'], dtype='datetime64[ns]', freq='4D')
最后一個日期不會從 True 變?yōu)?False,因此我們需要手動添加它。
添加回答
舉報