Skip to content

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  Charlie

Pará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        40

Seleccionar 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   60000

Eliminar 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étodoDevuelveIn-PlaceMúltiples colsManejo de col faltante
df.drop(columns=...)Nuevo DataFrameOpcional (inplace)errors='ignore'
del df[col]NadaSiempreNo (una a la vez)Lanza KeyError
df.pop(col)Series eliminadaSiempreNo (una a la vez)Lanza KeyError
df[cols_to_keep]Nuevo DataFrameNoSí (inverso)Lanza KeyError
df.select_dtypes()Nuevo DataFrameNoPor dtypeN/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.

📚