Come ottenere le ultime N righe di un DataFrame di Panda?


175

Ho un panda dataframe df1e df2(df1 è vanila dataframe, df2 è indicizzato da 'STK_ID' e 'RPT_Date'):

>>> 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 le ultime 3 righe 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 dai df1.ix[-3:]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(frame di dati senza indice)? Panda 0.10.1


3
È possibile utilizzare df[-3:]per produrre i risultati desiderati. Questo è stato risolto come un bug da WesM. Non so se / quando si sta facendo fisso: stackoverflow.com/questions/14035817/...
Zelazny7

@ Zelazny7 Non credo sia giusto. Penso che il taglio negativo sia ixstato un errore, ma non lo è passare passaggi negativi __getitem__. df.iloc[-3:]delegato internamente __getitem__con gli stessi argomenti, do df[-3:]è una scorciatoia per df.iloc[-3:], non un bug.
cs95,

Risposte:



74

Ciò è dovuto all'uso di indici interi ( ixseleziona quelli per etichetta su -3 anziché per posizione , e questo è in base alla progettazione: vedi l' indicizzazione di interi in panda "gotchas" *).

* Nelle versioni più recenti di Panda preferisce loc o iloc per rimuovere l'ambiguità di ix come posizione o etichetta:

df.iloc[-3:]

vedi i documenti .

Come sottolinea Wes, in questo caso specifico dovresti semplicemente usare la coda!


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

10

Come ottenere le ultime N righe di un DataFrame di Panda?

Se stai tagliando per posizione, __getitem__(cioè, tagliando con []) funziona bene, ed è la soluzione più concisa che ho trovato per questo problema.

pd.__version__
# '0.24.2'

df = pd.DataFrame({'A': list('aaabbbbc'), 'B': np.arange(1, 9)})
df

   A  B
0  a  1
1  a  2
2  a  3
3  b  4
4  b  5
5  b  6
6  b  7
7  c  8

df[-3:]

   A  B
5  b  6
6  b  7
7  c  8

Ciò equivale a chiamare df.iloc[-3:], ad esempio ( ilocdelegato internamente a __getitem__).


A parte, se vuoi trovare le ultime N righe per ciascun gruppo, usa groupbye GroupBy.tail:

df.groupby('A').tail(2)

   A  B
1  a  2
2  a  3
5  b  6
6  b  7
7  c  8
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.