Получить строки из Pandas DataFrame от индекса до условия - PullRequest
0 голосов
/ 13 сентября 2018

Скажем, у меня есть Pandas DataFrame:

x = pd.DataFrame(data=[5,4,3,2,1,0,1,2,3,4,5],columns=['value'])
x
Out[9]: 
    value
0       5
1       4
2       3
3       2
4       1
5       0
6       1
7       2
8       3
9       4
10      5

Теперь я хочу, учитывая индекс, найти строки в x, пока не будет выполнено условие.Например, если index = 2:

x.loc[2]
Out[14]: 
value    3
Name: 2, dtype: int64

Теперь я хочу из этого index найти следующие n строки, в которых значение больше некоторого threshold.Например, если threshold is 0, результаты должны быть:

x
Out[9]: 
    value
2       3
3       2
4       1
5       0

Как я могу это сделать?

Я пытался:

x.loc[2:x['value']>0,:]

Но изКонечно, это не будет работать, потому что x['value']>0 возвращает логический массив:

Out[20]: 
0      True
1      True
2      True
3      True
4      True
5     False
6      True
7      True
8      True
9      True
10     True
Name: value, dtype: bool

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Использование idxmin и нарезка

x.loc[2:x['value'].gt(0).idxmin(),:]

2    3
3    2
4    1
5    0
Name: value

Редактировать:

Для общей формулы используйте

index = 7
threshold = 2
x.loc[index:x.loc[index:,'value'].gt(threshold).idxmin(),:]

Из вашего описанияв комментариях казалось, что вы хотите начать с index+1, а не с индекса.Так что, если это так, просто используйте

x.loc[index+1:x.loc[index+1:,'value'].gt(threshold).idxmin(),:]
0 голосов
/ 13 сентября 2018

Вы хотите выполнить фильтрацию по индексу, большему, чем index=2, и по x['value']>=threshold, а затем выберите первые n из этих строк, что можно сделать с помощью .head(n).

Скажите:

idx = 2
threshold = 0
n = 4
x[(x.index>=idx) & (x['value']>=threshold)].head(n)

Out:

#      value
# 2     3
# 3     2
# 4     1
# 5     0

Редактировать: изменено на> = и обновлен пример, чтобы соответствовать примеру OP.

Редактировать 2 из-за пояснения от OP:так как n неизвестно:

idx = 2
threshold = 0
x.loc[idx:(x['value']<=threshold).loc[x.index>=idx].idxmax()]

Это выбирает от начального idx, в данном случае idx=2, до первой строки, где условие не выполняется (в данном случае)индекс 5).

...