2017-02-09 34 views
4

Скажем, у меня есть время серия dataframe с категориальным переменным и значением:Выбора строк до и после строки, представляющего интереса в пандах

In [4]: df = pd.DataFrame(data={'category': np.random.choice(['A', 'B', 'C', 'D'], 11), 'value': np.random.rand(11)}, index=pd.date_range('2015-04-20','2015-04-30')) 

In [5]: df 
Out[5]: 
      category  value 
2015-04-20  D 0.220804 
2015-04-21  A 0.992445 
2015-04-22  A 0.743648 
2015-04-23  B 0.337535 
2015-04-24  B 0.747340 
2015-04-25  B 0.839823 
2015-04-26  D 0.292628 
2015-04-27  D 0.906340 
2015-04-28  B 0.244044 
2015-04-29  A 0.070764 
2015-04-30  D 0.132221 

Если я заинтересован в рядах с категорией А, фильтрованием изолировать они тривиальны. Но что, если меня интересуют n строк до Категория А также? Если п = 2, я хотел бы увидеть что-то вроде:

In [5]: df[some boolean indexing] 
Out[5]: 
      category  value 
2015-04-20  D 0.220804 
2015-04-21  A 0.992445 
2015-04-22  A 0.743648 
2015-04-27  D 0.906340 
2015-04-28  B 0.244044 
2015-04-29  A 0.070764 

Точно так же, что, если я заинтересован в п строк вокруг категории элементов а? Опять же, если n = 2, я хотел бы видеть это:

In [5]: df[some other boolean indexing] 
Out[5]: 
      category  value 
2015-04-20  D 0.220804 
2015-04-21  A 0.992445 
2015-04-22  A 0.743648 
2015-04-23  B 0.337535 
2015-04-24  B 0.747340 
2015-04-27  D 0.906340 
2015-04-28  B 0.244044 
2015-04-29  A 0.070764 
2015-04-30  D 0.132221 

Спасибо!

+2

Вы могли бы найти это полезным: http://stackoverflow.com/questions/28837633/pandas-get-position-of-a-given- индекс-в-dataframe –

ответ

1

n ряды вокруг категории А годы:

In [223]: idx = df.index.get_indexer_for(df[df.category=='A'].index) 

In [224]: n = 1 

In [225]: df.iloc[np.unique(np.concatenate([np.arange(max(i-n,0), min(i+n+1, len(df))) 
              for i in idx]))] 
Out[225]: 
      category  value 
2015-04-20  D 0.220804 
2015-04-21  A 0.992445 
2015-04-22  A 0.743648 
2015-04-23  B 0.337535 
2015-04-28  B 0.244044 
2015-04-29  A 0.070764 
2015-04-30  D 0.132221 

In [226]: n = 2 

In [227]: df.iloc[np.unique(np.concatenate([np.arange(max(i-n,0), min(i+n+1, len(df))) 
              for i in idx]))] 
Out[227]: 
      category  value 
2015-04-20  D 0.220804 
2015-04-21  A 0.992445 
2015-04-22  A 0.743648 
2015-04-23  B 0.337535 
2015-04-24  B 0.747340 
2015-04-27  D 0.906340 
2015-04-28  B 0.244044 
2015-04-29  A 0.070764 
2015-04-30  D 0.132221 
4

Чтобы ответить на ваш первый вопрос:

df[pd.concat([df.category.shift(-i)=='A' for i in range(n)], axis=1).any(axis=1)] 

Вы, надеюсь, будет иметь возможность продлить тот же (возможно, несколько неуклюжий один) подход, чтобы покрыть больше дел.