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.
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 usardf = 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)
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
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
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
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 quelen(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