2013-02-02 21 views
72

mam pandy dataframe df1 i df2 (DF1 jest vanila dataframe, df2 jest indeksowana przez 'STK_ID' & 'RPT_Date'):Jak zdobyć ostatni n rządowej ramki danych pandy?

>>> 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 

mogę dostać ostatnie 3 rzędy df2 przez:

>>> 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 

podczas df1.ix[-3:] dać wszystkie wiersze:

>>> 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 

Dlaczego? Jak uzyskać ostatnie 3 wiersze z df1 (ramka danych bez indeksu)? Pandy 0.10.1

+3

Możesz użyć 'df [-3:]', aby uzyskać pożądane rezultaty. Zostało to potraktowane jako błąd WesM. Nie wiem, czy/kiedy to się naprawi: http://stackoverflow.com/questions/14035817/slicing-pandas-dataframe-with-negative-index-with-ix-method – Zelazny7

+0

Dzięki za informację – bigbug

+0

@ Zelazny7 możesz używać iryzów (liczby całkowite?), aby zrobić to bardziej intuicyjnie. Zachowanie 'df [-3:]' jest ** zwariowane ** dla ujemnych postaci DataFrames z indeksem całkowitym. –

Odpowiedz

194

Nie zapomnij o DataFrame.tail! na przykład df1.tail(10)

32

to z użyciem wskaźników całkowitych (ix wybiera Tymi etykiety nad -3 zamiast pozycji, a to jest wzorem: patrz integer indexing in pandas "gotchas" *).

* W nowszych wersjach pand wolą loc lub iloc usunąć dwuznaczność IX jako stanowisko lub etykiecie:

df.iloc[-3:] 

zobaczyć docs.

Jak wskazuje Wes, w tym konkretnym przypadku wystarczy użyć ogona!

Należy również zauważyć, że w Pand pre-0,14 iloc zgłosi IndexError na out-of-bounds dostępu, natomiast .head() i .tail() nie będzie:

>>> 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 

Old odpowiedź (amortyzowane metoda):

można użyć metody irows DataFrame pokonać tę dwuznaczność:

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 

Uwaga: Seria ma numer a similar iget method.

+0

@ DavidWolever Nie mogę odtworzyć twojego IndexError na 0.14.1, df.iloc [-5:] działa dobrze dla mnie z twoim przykładem. Którą wersję pandy używasz? –

Powiązane problemy