2013-02-02 16 views
72

Ho panda dataframe df1 e df2 (DF1 è vanila dataframe, DF2 è indicizzato da 'STK_ID' & 'RPT_Date'):Come ottenere l'ultima n riga di dataframe panda?

>>> df1 
    STK_ID RPT_Date TClose sales discount 
0 000568 20060331 3.69 5.975  NaN 
1 000568 20060630 9.14 10.143  NaN 
2 000568 20060930 9.49 13.854  NaN 
3 000568 20061231 15.84 19.262  NaN 
4 000568 20070331 17.00 6.803  NaN 
5 000568 20070630 26.31 12.940  NaN 
6 000568 20070930 39.12 19.977  NaN 
7 000568 20071231 45.94 29.269  NaN 
8 000568 20080331 38.75 12.668  NaN 
9 000568 20080630 30.09 21.102  NaN 
10 000568 20080930 26.00 30.769  NaN 

>>> df2 
       TClose sales discount net_sales cogs 
STK_ID RPT_Date            
000568 20060331 3.69 5.975  NaN  5.975 2.591 
     20060630 9.14 10.143  NaN  10.143 4.363 
     20060930 9.49 13.854  NaN  13.854 5.901 
     20061231 15.84 19.262  NaN  19.262 8.407 
     20070331 17.00 6.803  NaN  6.803 2.815 
     20070630 26.31 12.940  NaN  12.940 5.418 
     20070930 39.12 19.977  NaN  19.977 8.452 
     20071231 45.94 29.269  NaN  29.269 12.606 
     20080331 38.75 12.668  NaN  12.668 3.958 
     20080630 30.09 21.102  NaN  21.102 7.431 

posso ottenere gli ultimi 3 file di DF2 da:

>>> df2.ix[-3:] 
       TClose sales discount net_sales cogs 
STK_ID RPT_Date            
000568 20071231 45.94 29.269  NaN  29.269 12.606 
     20080331 38.75 12.668  NaN  12.668 3.958 
     20080630 30.09 21.102  NaN  21.102 7.431 

mentre df1.ix[-3:] dare tutte le righe:

>>> df1.ix[-3:] 
    STK_ID RPT_Date TClose sales discount 
0 000568 20060331 3.69 5.975  NaN 
1 000568 20060630 9.14 10.143  NaN 
2 000568 20060930 9.49 13.854  NaN 
3 000568 20061231 15.84 19.262  NaN 
4 000568 20070331 17.00 6.803  NaN 
5 000568 20070630 26.31 12.940  NaN 
6 000568 20070930 39.12 19.977  NaN 
7 000568 20071231 45.94 29.269  NaN 
8 000568 20080331 38.75 12.668  NaN 
9 000568 20080630 30.09 21.102  NaN 
10 000568 20080930 26.00 30.769  NaN 

Perché? Come ottenere le ultime 3 righe di df1 (dataframe senza indice)? Pandas 0.10.1

+3

È possibile utilizzare 'df [-3:]' per produrre i risultati desiderati. Questo è stato considerato un bug da WesM. Non so se/quando viene risolto: http://stackoverflow.com/questions/14035817/slicing-pandas-dataframe-with-negative-index-with-ix-method – Zelazny7

+0

Grazie per l'informazione – bigbug

+0

@ Zelazny7 è possibile utilizzare irows (righe intere?) per farlo in modo più intuitivo. Il comportamento di 'df [-3:]' è ** pazzo ** per numeri interi negativi di DataFrame. –

risposta

194

Non dimenticare DataFrame.tail! per esempio. df1.tail(10)

32

Questo è a causa dell'utilizzo di indici interi (ix seleziona quelli da etichetta sopra -3 anziché posizione, e ciò è di progettazione: vedasi integer indexing in pandas "gotchas" *).

* Nelle nuove versioni di Panda preferiscono loc o iLOC per rimuovere l'ambiguità della ix come la posizione o l'etichetta:

df.iloc[-3:] 

vedere il docs.

Come sottolinea Wes, in questo caso specifico si dovrebbe usare solo la coda!

Va inoltre notato che in Pandas pre-0.14 iloc alzerà un IndexError su un out-of-bounds accesso, mentre .head() e .tail() non lo farà:

>>> pd.__version__ 
'0.12.0' 
>>> df = pd.DataFrame([{"a": 1}, {"a": 2}]) 
>>> df.iloc[-5:] 
... 
IndexError: out-of-bounds on slice (end) 
>>> df.tail(5) 
    a 
0 1 
1 2 

Vecchio risposta (deprezzato metodo):

È possibile utilizzare il metodo irows dataframe per superare questa ambiguità:

In [11]: df1.irow(slice(-3, None)) 
Out[11]: 
    STK_ID RPT_Date TClose sales discount 
8  568 20080331 38.75 12.668  NaN 
9  568 20080630 30.09 21.102  NaN 
10  568 20080930 26.00 30.769  NaN 

Nota: la serie ha a similar iget method.

+0

@ DavidWolever Non riesco a riprodurre il tuo IndexError su 0.14.1, df.iloc [-5:] funziona bene per me con il tuo esempio. Quale versione di panda stai usando? –