
Al trabajar con grandes conjuntos de datos es habitual tener que eliminar registros para eliminar su tamaño. Por ejemplo, al importar los datos se un archivo CSV puede ser que los registros de algunas columnas no sean necesarios. En esta entrada vamos a explicar cómo eliminar columnas y filas en un dataframe pandas.
Para poder eliminar datos de un dataframe es necesario disponer antes de uno. Para ello se puede crear un listado de facturas con seis registros y cinco características. Esto es lo que se hace en el siguiente código.
import pandas as pd invoices = {'invoice': [1, 2, 3, 4, 5, 6], 'client': [4, 1, 3, 1, 2, 6], 'units': [3, 2, 1, 2, 1, 1], 'price': [27.76, 21.13, 29.82, 29.96, 21.11, 23.97], 'total': [83.28, 42.26, 29.82, 59.92, 21.11, 23.97]} invoices = pd.DataFrame(invoices)
invoice client units price total 0 1 4 3 27.76 83.28 1 2 1 2 21.13 42.26 2 3 3 1 29.82 29.82 3 4 1 2 29.96 59.92 4 5 2 1 21.11 21.11 5 6 6 1 23.97 23.97
Cómo eliminar una sola columna de un dataframe
Para eliminar una columna de un dataframe de pandas se puede utilizar el método drop
. Este método requiere como argumento el nombre de la columna en una lista. Además, como el método puede eliminar tanto filas como columnas, es necesario especificar el eje. En el caso de las columnas el valor de esta propiedad es 1. Ahora, para eliminar el identificador de clientes del conjunto de ejemplo se puede utilizar el siguiente código.

invoices.drop(['client'], axis=1)
invoice units price total 0 1 3 27.76 83.28 1 2 2 21.13 42.26 2 3 1 29.82 29.82 3 4 2 29.96 59.92 4 5 1 21.11 21.11 5 6 1 23.97 23.97
El resultado es un nuevo dataframe sin la columna indicada en la lista.
Cómo eliminar múltiples columnas de un dataframe
El método drop
también se puede utilizar para eliminar más de una columna. Lo que se puede conseguir indicar como argumento una lista con más de un nombre. Así, en el caso se eliminar el identificador de factura, de cliente y el número de unidades se puede utilizar el siguiente código.
invoices.drop(['invoice', 'client', 'units'], axis=1)
price total 0 27.76 83.28 1 21.13 42.26 2 29.82 29.82 3 29.96 59.92 4 21.11 21.11 5 23.97 23.97
Puede observarse que sigue siendo necesario indicar el eje como en el caso anterior. El resultado es el esperado, un nuevo dataframe sin las columnas indicadas.
Cómo eliminar filas de un dataframe
Tal como se ha comentado anteriormente el método drop
puede eliminar tanto filas como columnas. Para eliminar filas es necesario indicar como argumento del método una lista el índice de estas. Además, en este caso el valor que se ha de asignar a la propiedad axis
es cero. Por ejemplo, para eliminar los registros 1 y 2 se puede emplear el siguiente código.
invoices.drop([1, 2],axis=0)
invoice client units price total 0 1 4 3 27.76 83.28 3 4 1 2 29.96 59.92 4 5 2 1 21.11 21.11 5 6 6 1 23.97 23.97
Obteniéndose como resultado un nuevo dataframe sin las filas seleccionadas en la lista. Otra forma de seleccionar las filas a eliminar es mediante range
. Lo que permite seleccionar rápidamente cualquier subconjunto. Por ejemplo, para eliminar las filas impares se puede utilizar range
desde 1 hasta 6 en pasos de dos. Siendo esto lo que se hace en siguiente ejemplo.
invoices.drop(range(1, 6, 2),axis=0)
invoice client units price total 0 1 4 3 27.76 83.28 2 3 3 1 29.82 29.82 4 5 2 1 21.11 21.11
En donde el resultado es un nuevo dataframe sin las filas 1, 3 y 5.
Conclusiones
En esta entrada se ha visto cómo eliminar columnas y filas en un dataframe pandas. Para lo que se ha visto el método drop
de estos objetos. Saber utilizar este método es básico para limpiar correctamente los conjuntos de datos antes de realizar cualquier análisis.
Imágenes: Pixabay (Free-Photos)
Muchisimas gracias!
gracias
Hola, me gustaría saber como puedo borrar filas con una variable específica. Partiendo de tu ejemplo, quisiera borrar la fila en la cual el precio es == 27.76
Usando
drop
una solución podría ser:invoices.drop(invoices.index[invoices.price == 27.76], axis=0)
Aunque para ese problema yo prefiero
loc
, como explico en detalle en la entrada: https://www.analyticslane.com/2019/06/21/seleccionar-filas-y-columnas-en-pandas-con-iloc-y-loc/.invoices.loc[invoices.price != 27.76, :]
Hola Daniel, perdón pero aprovecho para consultarte. ¿Como puedo eliminar una columna de una matriz en caso de que en una de sus filas tenga por ejemplo un valor 0
Hola Claudio,
Para eliminar columnas que solamente tiene 0 se puede usar:
df.loc[:, (df != 0).any()]
pero si es para eliminar columnas con algún 0 se puede emplear:
df.loc[:, (df != 0).all()]
gracias
Sencillo y claro. Gracias por tu tiempo
Sergio
Hola, existe una forma de almacenar el contenido del excel sin que imprima la cabecera? y tampoco coloque columna 0,1,2…etc.
Si, para eso existen los parámetros header y index del método to_excel que evitan que se guarde la cabecera y los índices respectivamente. Mas detalles de este método los puede ver en la entrada Guardar y leer archivos Excel en Python
Hola Daniel, buenas tardes.
cómo puedo hacer para eliminar una columna que tiene varios niveles en su nombre:
Valores Valores
Ganancia Perdida
0
1
y por ejemplo deseo eliminar la columna [Valores ,Ganancia], el método Drop no funciona en su forma estándar,
Agradezco si me puede ayudar con esto.
En el caso propuesto es necesario indicar también el nivel que se desea borrar, algo que se puede hacer con:
df.drop('Ganancia', axis=1, level=1)
Muchas gracias por la respuesta Daniel, por quebrantos de salud no había podido responder antes.
Buenas estoy convirtiendo un Dataframe a excel usando la función to_excel, mi problema es que cuando se crea toma la numeración como una columna extra ¿alguno sabe como podría evitar que se cree dicha columna?
Entiendo que lo que se desea evitar es que aparezcan los incides, para ello hay que cambiar el valor de la propiedad
index
de la función a falso, esto es, usar algo comodf.to_excel("File.xlsx", index=False)
Hola Daniel buen día:
Una duda como podría eliminar o excluir aquellas filas que contengan una parte de un texto, es decir lo contrario a “contains”.
De antemano Gracias.
Una opción sería usa el método contains para filtrar los registros que cumple la condición
df = df[df['column'].str.contains('string')]
Mientras que para los que no la cumple se puede usar algo como
df = df[df['column'].str.contains('string')==False]
En donde
'column'
es el nombre de la columna y'string'
la cadena que se desea buscar.