¿Cómo obtener las últimas N filas de un DataFrame de pandas?

175

Tengo un marco de datos de pandas df1y df2(df1 es un marco de datos de vanila, df2 está indexado por 'STK_ID' y '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

Puedo obtener las últimas 3 filas de df2 por:

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

mientras df1.ix[-3:]da todas las filas:

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

Por qué ? ¿Cómo obtener las últimas 3 filas de df1(marco de datos sin índice)? Pandas 0.10.1

bicho grande
fuente
3
Puede usar df[-3:]para producir los resultados que desea. Esto fue abordado como un error por WesM. No estoy seguro de si / cuándo se está arreglando: stackoverflow.com/questions/14035817/…
Zelazny7
@ Zelazny7 No creo que sea correcto. Creo que el corte negativo con ixfue un error, pero pasar rebanadas negativas __getitem__no lo es. df.iloc[-3:]internamente delega __getitem__con los mismos argumentos, do df[-3:]es un acceso directo para df.iloc[-3:], no un error.
cs95

Respuestas:

394

No se olvide DataFrame.tail! p.ejdf1.tail(10)

Wes McKinney
fuente
Lo hice ... olvidé: o
Mike Rapadas
74

Esto se debe al uso de índices enteros (los ixselecciona por etiqueta sobre -3 en lugar de por posición , y esto es por diseño: vea la indexación de enteros en pandas "gotchas" *).

* En las versiones más recientes de los pandas, prefiera loc o iloc para eliminar la ambigüedad de ix como posición o etiqueta:

df.iloc[-3:]

ver los documentos .

Como señala Wes, en este caso específico, ¡solo debes usar la cola!

Andy Hayden
fuente
1
@DavidWolever No puedo reproducir su IndexError en 0.14.1, df.iloc [-5:] funciona bien para mí con su ejemplo. ¿Qué versión de pandas estás usando?
Andy Hayden
10

¿Cómo obtener las últimas N filas de un DataFrame de pandas?

Si está cortando por posición, __getitem__(es decir, cortando con []) funciona bien, y es la solución más sucinta que he encontrado para este 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

Esto es lo mismo que llamar df.iloc[-3:], por ejemplo ( ilocdelega internamente a __getitem__).


Por otro lado, si desea encontrar las últimas N filas para cada grupo, use groupbyy GroupBy.tail:

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

   A  B
1  a  2
2  a  3
5  b  6
6  b  7
7  c  8
cs95
fuente