Pandas Drop Column: Cómo eliminar columnas de un DataFrame
Updated on
Los DataFrames de fuentes del mundo real rara vez llegan solo con las columnas que necesita. Las exportaciones CSV incluyen columnas de metadatos, las consultas a bases de datos traen campos adicionales y las respuestas de API contienen datos anidados que ya ha aplanado. Antes de cualquier análisis significativo, necesita eliminar las columnas irrelevantes. Hacerlo mal -- eliminar accidentalmente la columna equivocada o modificar el DataFrame original cuando pretendía crear una copia -- causa errores de pérdida de datos que pueden ser difíciles de rastrear.
Pandas proporciona varios métodos para eliminar columnas, cada uno adecuado para diferentes situaciones. El método drop() es el más versátil, pero del, pop() y la selección de columnas ofrecen alternativas útiles. Esta guía cubre cada enfoque con ejemplos claros que muestran cuándo usar cada uno.
Usando df.drop() -- El enfoque estándar
El método drop() es la forma principal de eliminar columnas. Pase nombres de columnas y establezca axis=1 (o use el parámetro columns).
Eliminar una sola columna
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35],
'salary': [50000, 60000, 70000],
'department': ['Engineering', 'Marketing', 'Sales'],
})
# Método 1: Usando el parámetro columns (recomendado)
df_clean = df.drop(columns=['salary'])
print(df_clean)
# Método 2: Usando axis=1
df_clean = df.drop('salary', axis=1)Eliminar múltiples columnas
import pandas as pd
df = pd.DataFrame({
'id': [1, 2, 3],
'name': ['Alice', 'Bob', 'Charlie'],
'email': ['a@test.com', 'b@test.com', 'c@test.com'],
'temp_col': [None, None, None],
'internal_id': ['X1', 'X2', 'X3'],
})
# Eliminar múltiples columnas a la vez
df_clean = df.drop(columns=['temp_col', 'internal_id', 'email'])
print(df_clean)
# id name
# 0 1 Alice
# 1 2 Bob
# 2 3 CharlieParámetro inplace
Por defecto, drop() devuelve un nuevo DataFrame. Use inplace=True para modificar el original:
import pandas as pd
df = pd.DataFrame({'a': [1], 'b': [2], 'c': [3]})
# Devuelve nuevo DataFrame (original sin cambios)
new_df = df.drop(columns=['b'])
print(df.columns.tolist()) # ['a', 'b', 'c'] (sin cambios)
print(new_df.columns.tolist()) # ['a', 'c']
# Modifica el DataFrame original
df.drop(columns=['b'], inplace=True)
print(df.columns.tolist()) # ['a', 'c']Manejo de columnas faltantes con el parámetro errors
import pandas as pd
df = pd.DataFrame({'a': [1], 'b': [2], 'c': [3]})
# Por defecto: lanza KeyError si la columna no existe
# df.drop(columns=['d']) # KeyError: "['d'] not found in axis"
# Ignorar columnas faltantes
df_clean = df.drop(columns=['b', 'd'], errors='ignore')
print(df_clean.columns.tolist()) # ['a', 'c']Usando la sentencia del
La sentencia del elimina una columna in-place. Es concisa pero limitada a una columna a la vez.
import pandas as pd
df = pd.DataFrame({'a': [1, 2], 'b': [3, 4], 'c': [5, 6]})
del df['b']
print(df.columns.tolist()) # ['a', 'c']Limitaciones: No puede eliminar múltiples columnas a la vez. No puede ignorar columnas faltantes (lanza KeyError). Siempre modifica in-place.
Usando df.pop()
pop() elimina una columna y la devuelve como Series. Útil cuando necesita la columna eliminada para uso posterior.
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'target': [1, 0],
'feature1': [10, 20],
'feature2': [30, 40],
})
# Extraer la columna objetivo mientras se elimina del DataFrame
y = df.pop('target')
X = df
print(y)
# 0 1
# 1 0
# Name: target, dtype: int64
print(X)
# name feature1 feature2
# 0 Alice 10 30
# 1 Bob 20 40Seleccionar columnas (inverso de eliminar)
A veces es más fácil seleccionar las columnas que desea en lugar de listar las que quiere eliminar.
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [25, 30],
'salary': [50000, 60000],
'dept': ['Eng', 'Mkt'],
'internal_id': ['X1', 'X2'],
})
# Mantener solo columnas específicas
df_clean = df[['name', 'age', 'salary']]
# Eliminar columnas seleccionando todo excepto ellas
df_clean = df.loc[:, df.columns != 'internal_id']
# Mantener columnas que cumplan una condición
df_numeric = df.select_dtypes(include='number')
print(df_numeric)
# age salary
# 0 25 50000
# 1 30 60000Eliminar columnas por patrón o condición
Eliminar columnas por patrón de nombre
import pandas as pd
df = pd.DataFrame({
'name': ['Alice'], 'age': [25],
'temp_1': [None], 'temp_2': [None],
'internal_flag': [True],
})
# Eliminar columnas que empiecen con 'temp_'
cols_to_drop = [c for c in df.columns if c.startswith('temp_')]
df_clean = df.drop(columns=cols_to_drop)
print(df_clean.columns.tolist()) # ['name', 'age', 'internal_flag']
# Eliminar columnas que contengan 'internal'
cols_to_drop = [c for c in df.columns if 'internal' in c]
df_clean = df.drop(columns=cols_to_drop)
# Usar filter() para mantener columnas coincidentes
df_temps = df.filter(like='temp') # Mantiene solo columnas con 'temp'
df_no_temps = df.drop(columns=df.filter(like='temp').columns)Eliminar columnas por tipo de datos
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [25, 30],
'score': [95.5, 87.3],
'active': [True, False],
})
# Eliminar todas las columnas no numéricas
df_numeric = df.select_dtypes(include='number')
# Eliminar todas las columnas object (string)
df_no_strings = df.select_dtypes(exclude='object')
print(df_no_strings.columns.tolist()) # ['age', 'score', 'active']Eliminar columnas con demasiados valores faltantes
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': [1, np.nan, np.nan, np.nan, np.nan],
'c': [1, 2, np.nan, 4, 5],
'd': [np.nan, np.nan, np.nan, np.nan, np.nan],
})
# Eliminar columnas donde más del 50% de los valores faltan
threshold = len(df) * 0.5
df_clean = df.dropna(axis=1, thresh=int(threshold))
print(df_clean.columns.tolist()) # ['a', 'c']Comparación de métodos
| Método | Devuelve | In-Place | Múltiples cols | Manejo de col faltante |
|---|---|---|---|---|
df.drop(columns=...) | Nuevo DataFrame | Opcional (inplace) | Sí | errors='ignore' |
del df[col] | Nada | Siempre | No (una a la vez) | Lanza KeyError |
df.pop(col) | Series eliminada | Siempre | No (una a la vez) | Lanza KeyError |
df[cols_to_keep] | Nuevo DataFrame | No | Sí (inverso) | Lanza KeyError |
df.select_dtypes() | Nuevo DataFrame | No | Por dtype | N/A |
Visualizar su DataFrame limpio
Después de eliminar columnas y limpiar sus datos, PyGWalker (opens in a new tab) proporciona una interfaz interactiva estilo Tableau para explorar el DataFrame limpio directamente en Jupyter:
import pygwalker as pyg
# Después de limpiar su DataFrame
walker = pyg.walk(df_clean)Esto le permite arrastrar y soltar las columnas restantes para crear gráficos sin escribir código de visualización.
FAQ
¿Cómo elimino una columna en pandas?
Use df.drop(columns=['nombre_columna']) para eliminar una columna y devolver un nuevo DataFrame. Para eliminación in-place, agregue inplace=True. También puede usar del df['nombre_columna'] para una eliminación rápida in-place, o df.pop('nombre_columna') para eliminar y devolver la columna como Series.
¿Cómo elimino múltiples columnas a la vez?
Pase una lista de nombres de columnas a df.drop(columns=['col1', 'col2', 'col3']). Esto elimina todas las columnas especificadas en una sola operación y devuelve un nuevo DataFrame.
¿Cómo elimino columnas condicionalmente (por patrón o tipo de datos)?
Para patrones de nombre, use comprensión de lista: df.drop(columns=[c for c in df.columns if c.startswith('temp_')]). Para tipos de datos, use df.select_dtypes(exclude='object') para eliminar columnas de texto, o df.select_dtypes(include='number') para mantener solo columnas numéricas.
¿Cuál es la diferencia entre drop() y del para eliminar columnas?
df.drop() devuelve un nuevo DataFrame por defecto, puede manejar múltiples columnas a la vez, y tiene una opción errors='ignore' para columnas faltantes. del df[col] siempre modifica in-place, funciona con una columna a la vez, y lanza KeyError si la columna no existe.
¿Cómo elimino columnas con valores faltantes?
Use df.dropna(axis=1) para eliminar cualquier columna que tenga al menos un NaN. Use df.dropna(axis=1, thresh=n) para mantener solo columnas con al menos n valores no nulos. Para umbrales personalizados, filtre por el porcentaje de nulos: df.loc[:, df.isnull().mean() < 0.5] mantiene columnas con menos del 50% de datos faltantes.
Conclusión
Para la mayoría de situaciones, df.drop(columns=[...]) es la opción correcta -- es explícito, maneja múltiples columnas y devuelve un nuevo DataFrame por defecto. Use del para eliminación rápida in-place de una sola columna, pop() cuando necesite la columna eliminada, y selección de columnas o select_dtypes() cuando sea más fácil especificar lo que quiere mantener en lugar de lo que quiere eliminar.