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

104

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

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

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

tumultous_rooster
fuente
27
DF = DF[:-1]?
U2EF1
@ U2EF1 esto copia todo el conjunto de datos, ¿no? Cuando se manejan grandes datos, esto puede ser un problema.
ManuelSchneid3r

Respuestas:

163

Para eliminar las últimas n filas:

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

Del mismo modo, puede colocar las primeras n filas:

df.drop(df.head(n).index,inplace=True) # drop first n rows
Kane masticar
fuente
Para eliminar 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 (columnas = ['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
78
DF[:-n]

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

Para quitar la última fila:

DF = DF[:-1]
cielo azul
fuente
58

Dado que el posicionamiento del índice en Python se basa en 0, en realidad no habrá un elemento en indexla ubicación 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 sencillo escribir DF[:-1].

ely
fuente
2
Tenga en cuenta que al eliminar el uso de dfrm.index, el índice de la última fila debe ser único; de lo contrario, se eliminan todas las filas con ese índice.
FranciscoD
¿Entiendo correctamente, que al usar drop (inplace = True) modificas el df existente, mientras que al usar df [: - 1] obtienes una vista de los datos, que luego puede llevar a SettingWithCopyWarning?
Philipp
21

Sorprendido, nadie mencionó este:

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

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

La ejecución de una prueba de velocidad en un DataFrame de 1000 filas muestra que cortar y head/ tailes ~ 6 veces más rápido 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)
theGirrafish
fuente
Quizás la diferencia entre ambos enfoques es que head()y tail()crear una vista mientras que en drop()realidad cambia la representación en la memoria (ya sea una modificación en el lugar o crea un marco de datos completamente nuevo). No busqué esto en documentos, que alguien lo haga. (si esa es la diferencia: buena explicación para la diferencia de rendimiento, y hay que elegir cuidadosamente entre ellos) /
Dr. Jan-Philip Gehrcke
@ Dr.Jan-PhilipGehrcke Head head, taily droptodos devuelven una vista, aunque es cierto que drople da la opción de modificar el marco de datos original en su lugar.
theGirrafish
5
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

La salida de 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, predeterminado 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
Riz.Khan
fuente
1

drop devuelve una nueva matriz, por eso se ahogó en la publicación og; Tenía un requisito similar para cambiar el nombre de algunos encabezados de columna y eliminé algunas filas debido a un archivo csv mal formado convertido a Dataframe, así que después de leer esta publicación usé:

newList = pd.DataFrame(newList)
newList.columns = ['Area', 'Price']
print(newList)
# newList = newList.drop(0)
# newList = newList.drop(len(newList))
newList = newList[1:-1]
print(newList)

y funcionó muy bien, como puede ver con las dos líneas comentadas arriba. Probé el método drop. () y funcionó pero no tan kool y legible como usar [n: -n], espero que ayude a alguien, gracias.

Hora estelar
fuente
0

Para DataFrames más complejos que tienen un índice múltiple (diga "Stock" y "Fecha") y uno quiere eliminar la última fila de cada Stock, no solo la última fila del último Stock, entonces la solución dice:

# To remove last n rows
df = df.groupby(level='Stock').apply(lambda x: x.head(-1)).reset_index(0, drop=True)

# To remove first n rows
df = df.groupby(level='Stock').apply(lambda x: x.tail(-1)).reset_index(0, drop=True)

Como groupby()está agregando un nivel adicional al índice múltiple, simplemente lo soltamos al final usando reset_index(). El df resultante mantiene el mismo tipo de índice múltiple que antes de la operación.

Dorian B.
fuente