2015-04-23 10 views
9

Diciamo Ho il seguente:il numero di righe prima e dopo un certo valore di indice in pandi

In [1]: import pandas as pd 
     import numpy as np 
     df = pd.DataFrame(data=np.random.rand(11),index=pd.date_range('2015-04-20','2015-04-30'),columns=['A']) 
Out[1]: 
       A 
2015-04-20 0.694983 
2015-04-21 0.393851 
2015-04-22 0.690138 
2015-04-23 0.674222 
2015-04-24 0.763175 
2015-04-25 0.761917 
2015-04-26 0.999274 
2015-04-27 0.907871 
2015-04-28 0.464818 
2015-04-29 0.005733 
2015-04-30 0.806351 

ho qualche metodo complicato che identifica un singolo indice come interessante, per esempio '2015-04 -25' . Posso recuperare la riga con quella indice utilizzando:

In [2]: df.loc['2015-04-25'] 
Out[2]: 
A 0.761917 
Name: 2015-04-25 00:00:00, dtype: float64 

quale sarebbe il modo più bello per ottenere un numero di n righe prima e/o dopo tale valore dell'indice?

Quello che vorrei fare è qualcosa di simile:

In[3]: df.getRowsBeforeLoc('2015-04-25',3) 
Out[3]: 
2015-04-22 0.690138 
2015-04-23 0.674222 
2015-04-24 0.763175 
2015-04-25 0.761917 

o equivalentemente:

In[3]: df.getRowsAfterLoc('2015-04-25',3) 
Out[3]: 
2015-04-25 0.761917 
2015-04-26 0.999274 
2015-04-27 0.907871 
2015-04-28 0.464818 

(non ho una forte opinione sulla necessità o meno la riga che corrisponde al valore di indice di destinazione in sé è incluso)

risposta

9

loc supporta affettare il punto di Beg/finale inclusa nella gamma:.

In [363]: 

df.loc[:'2015-04-25'] 
Out[363]: 
        A 
2015-04-25 0.141787 
2015-04-26 0.598237 
2015-04-27 0.106461 
2015-04-28 0.297159 
2015-04-29 0.058392 
2015-04-30 0.621325 
In [364]: 

df.loc['2015-04-25':] 
Out[364]: 
        A 
2015-04-25 0.141787 
2015-04-26 0.598237 
2015-04-27 0.106461 
2015-04-28 0.297159 
2015-04-29 0.058392 
2015-04-30 0.621325 

Per ottenere sia primi/ultimi (n) righe utilizzano head/tail:

In [378]: 

df.loc[:'2015-04-25'].head(3) 
Out[378]: 
        A 
2015-04-20 0.827699 
2015-04-21 0.901140 
2015-04-22 0.427304 

In [377]: 

df.loc[:'2015-04-25'].tail(3) 
Out[377]: 
        A 
2015-04-23 0.002189 
2015-04-24 0.041965 
2015-04-25 0.141787 

aggiornamento

Per ottenere la riga prima/dopo un valore specifc possiamo usare get_loc sulla indice per restituire una posizione intera e quindi utilizzare questo con iloc per ottenere la riga precedente/successiva:

In [388]: 

df.index.get_loc('2015-04-25') 
Out[388]: 
5 
In [391]: 

df.iloc[df.index.get_loc('2015-04-25')-1] 
Out[391]: 
A 0.041965 
Name: 2015-04-24 00:00:00, dtype: float64 
In [392]: 

df.iloc[df.index.get_loc('2015-04-25')+1] 
Out[392]: 
A 0.598237 
Name: 2015-04-26 00:00:00, dtype: float64 
+0

Bello e semplice! Per ottenere solo un numero limitato di valori, farei quindi: df.loc [: '2015-04-25']. Tail (3) – jkokorian

+0

Sì, è corretto, vedere la risposta aggiornata – EdChum

+0

E una domanda correlata potrebbe anche essere in grado di rispondere: come otterresti una singola riga (o indice) prima o dopo l'indice di destinazione? Quindi escludendo l'obiettivo stesso? – jkokorian

Problemi correlati