Cómo eliminar la última fila de datos de un marco de datos de pandas

4 minutos de lectura

avatar de usuario
gallo_tumultuoso

Creo que esto debería ser simple, pero probé algunas ideas y ninguna funcionó:

last_row = len(DF)
DF = DF.drop(DF.index[last_row])  #<-- fail!

Intenté usar índices negativos pero eso también conduce a errores. Todavía debo estar malinterpretando algo básico.

  • DF = DF[:-1]?

    – U2EF1

    14 de noviembre de 2014 a las 1:55

  • @U2EF1 esto copia todo el conjunto de datos, ¿no? Cuando se manejan grandes cantidades de datos, esto puede ser un problema.

    – ManuelSchneid3r

    17 dic 2019 a las 18:50

  • si last_row está tomando la longitud de DF, entonces debe usar (last_row-1) para la indexación.

    – Anoyz

    17 de julio de 2021 a las 18:31

  • Es una buena práctica usar df.shape[0] más bien que len(df) para obtener el número de filas.

    – pabz

    12 de agosto de 2021 a las 14:27

  • ¿Por qué esa es una buena práctica @pabz?

    – Tavín

    6 jun a las 22:22

avatar de usuario
kane masticar

Para soltar las últimas n filas:

df.drop(df.tail(n).index,inplace=True) # drop last n rows

De la misma manera, puede soltar las primeras n filas:

df.drop(df.head(n).index,inplace=True) # drop first n rows

  • Para soltar la última columna, puede usar df.drop(df.columns[-1]axis=1, inplace=True) o, si conoce el nombre de la columna, puede usar df.drop(columns=[‘col_name’]inplace=True): si no desea que se realice en su lugar, asígnelo a una nueva variable y elimine ese argumento.

    – Shawn Schreier

    24 de abril de 2020 a las 18:24

  • Este método solo funciona si el índice de la última fila es único, ya que elimina todas las filas que tienen el mismo índice que las últimas n filas. La respuesta de @blue-sky parece más apropiada

    – Bernardo

    5 de enero de 2021 a las 5:32

DF[:-n]

donde n es el último número de filas a eliminar.

Para soltar la última fila:

DF = DF[:-1]

  • Esto funciona, pero sospecho que a Wes McKinney no le gustaría. ¿Por qué no usar las cosas integradas en Pandas?

    – pabz

    12 de agosto de 2021 a las 14:32

  • Tal vez obsoleto porque recibí un error, estaba buscando una columna llamada -1. Tuve que usar df = df.iloc[:-1]

    – Ssayan

    15 de febrero a las 9:56

  • Según mis pruebas, esto es al menos 6 veces más rápido que usar .drop()!

    –Daniel Goldfarb

    21 de junio a las 20:10

Dado que el posicionamiento del índice en Python está basado en 0, en realidad no habrá un elemento en index en el lugar correspondiente a len(DF). Necesitas que sea last_row = len(DF) - 1:

In [49]: dfrm
Out[49]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723
9  0.834706  0.002989  0.333436

[10 rows x 3 columns]

In [50]: dfrm.drop(dfrm.index[len(dfrm)-1])
Out[50]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723

[9 rows x 3 columns]

Sin embargo, es mucho más simple simplemente escribir DF[:-1].

  • Tenga en cuenta que al descartar mediante dfrm.index, el índice de la última fila debe ser único; de lo contrario, se eliminarán todas las filas con ese índice.

    – FranciscoD

    28/10/2017 a las 22:13

  • ¿Entiendo correctamente que al usar drop (inplace = True) modifica el df existente, mientras usa df[:-1] obtiene una vista de los datos, que luego puede conducir a SettingWithCopyWarning?

    – Felipe

    5 de noviembre de 2019 a las 8:17


Sorprendido, nadie mencionó esto:

# To remove last n rows
df.head(-n)

# To remove first n rows
df.tail(-n)

Ejecutar una prueba de velocidad en un DataFrame de 1000 filas muestra que cortar y head/tail son ~6 veces más rápidos que usar drop:

>>> %timeit df[:-1]
125 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.head(-1)
129 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.drop(df.tail(1).index)
751 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

avatar de usuario
Pedro algodón

Solo usa la indexación

df.iloc[:-1,:]

Por eso existe iloc. También puedes usar cabeza o cola.

  • Considere ampliar su respuesta y explicar cómo y por qué funciona su solución

    – Marsroverr

    19 de noviembre de 2020 a las 19:09

avatar de usuario
Nir Friedman

La mejor solución que he encontrado que no hace (¿necesariamente?) una copia completa es

df.drop(df.index[-1], inplace=True)

Por supuesto, simplemente puede omitir inplace=True para crear un nuevo marco de datos, y también puede eliminar fácilmente las últimas N filas simplemente tomando porciones de df.index (df.index[-N:] para eliminar las últimas N filas). Por lo tanto, este enfoque no solo es conciso sino también muy flexible.

  • Considere ampliar su respuesta y explicar cómo y por qué funciona su solución

    – Marsroverr

    19 de noviembre de 2020 a las 19:09

avatar de usuario
MK

stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

La salida de las estadísticas:

       A            B          C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
9   0.834706    0.002989    0.333436

Solo usa skipfooter=1

skipfooter: int, por defecto 0

Número de líneas en la parte inferior del archivo para omitir

stats_2 = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv", skipfooter=1, engine="python")

Salida de stats_2

       A          B            C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723

¿Ha sido útil esta solución?