Как получить начальный и конечный индекс группы 1 в серии? - PullRequest
1 голос
/ 06 февраля 2020

У меня есть серия, как показано ниже:

index value
0       0
1       1
2       1
3       1
4       0
5       0
6       1
7       1
8       0
9       1
10      0
11      0
12      1
13      1
14      0

и ожидаемый результат:

index, start, end
0       1       3
1       6       7
2       9       9
3       12      13

Как мне добиться этого с pandas?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Создание последовательных 1 групп по Series.shift с Series.cumsum и фильтрация по Series.eq (==), а затем агрегирование GroupBy.first и GroupBy.last:

df = df.reset_index()
m = df['value'].eq(1)
g = m.ne(m.shift()).cumsum()[m]

df = df.groupby(g)['index'].agg([('start','first'),('end','last')]).reset_index(drop=True)
print (df)
   start  end
0      1    3
1      6    7
2      9    9
3     12   13
0 голосов
/ 06 февраля 2020

Всего пара строк с использованием pandas с использованием индекса pd.Series.diff:

# Difference between consecutive values. A -1 is an 'end', a 1 is a 'start'
df_diff = df.diff()
df_res = pd.DataFrame()
df_res['start'] = df_diff[df_diff==1].index
df_res['end'] = df_diff[df_diff==-1].index -1

# Result
df_res
#   start  end
#0      1    3
#1      6    7
#2      9    9
#3     12   13

Примечание: df, созданный с использованием:

import pandas as pd
df = pd.Series({0:0,1:1,2:1,3:1,4:0,5:0,6:1,7:1,8:0,9:1,10:0,11:0,12:1,13:1,14:0})
...