0Pricing
Pandas & NumPy Academy · Lección

Combinar y limpiar columnas de texto

Concatene varias columnas en una sola cadena, elimine los espacios en blanco y normalice las etiquetas de categoría inconsistentes.

Combinar y limpiar columnas de texto es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

Concatenar columnas de texto

Una tarea habitual de preparación de datos consiste en crear una sola cadena combinando valores de varias columnas; por ejemplo, crear un nombre completo a partir del nombre y el apellido, o una dirección a partir de la calle, la ciudad y el país. En Pandas, concatene columnas de cadenas mediante el operador + aplicado a dos Series (o a una Serie y una cadena literal), después de convertir las columnas numéricas a cadenas con .astype(str).

import pandas as pd

df = pd.DataFrame({
    'first_name': ['Alice', 'Bob', 'Carol'],
    'last_name': ['Smith', 'Jones', 'White']
})

df['full_name'] = df['first_name'] + ' ' + df['last_name']
print(df['full_name'].tolist())
# ['Alice Smith', 'Bob Jones', 'Carol White']

Concatenar con columnas que no son de texto

Al combinar una columna numérica con una columna de texto, primero debe convertir la columna numérica a cadena mediante .astype(str). El operador + de Python genera un TypeError si intenta sumar una Serie de cadenas y una Serie de enteros. Esta es una fuente habitual de confusión al crear claves compuestas o etiquetas a partir de columnas de tipos mixtos.

import pandas as pd

df = pd.DataFrame({
    'product': ['Widget', 'Gadget'],
    'version': [3, 5]
})

# Must convert int to str before concatenating
df['label'] = df['product'] + ' v' + df['version'].astype(str)
print(df['label'].tolist())
# ['Widget v3', 'Gadget v5']

.str.cat() para unir con un separador

Series.str.cat(others, sep=) es la forma propia de Pandas de concatenar varias Series con un separador y gestionar correctamente los valores NaN. De forma predeterminada, un NaN en cualquier columna hace que el resultado de esa fila sea NaN. Pase na_rep='?' (o cualquier cadena) para reemplazar NaN por un marcador en lugar de propagarlo.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'city': ['NYC', 'LA', None],
    'state': ['NY', None, 'TX'],
    'country': ['USA', 'USA', 'USA']
})

# Join with ', ' — NaN rows produce NaN by default
df['location'] = df['city'].str.cat(
    [df['state'], df['country']],
    sep=', ',
    na_rep='N/A'
)
print(df['location'].tolist())
# ['NYC, NY, USA', 'LA, N/A, USA', 'N/A, TX, USA']

Normalizar etiquetas de categorías inconsistentes

Las columnas de categorías del mundo real suelen tener etiquetas inconsistentes debido a errores tipográficos, variaciones entre mayúsculas y minúsculas o abreviaturas diferentes (por ejemplo, 'US', 'USA', 'United States'). La solución estándar consiste en crear un diccionario de correspondencias que asigne cada variante a la forma canónica y aplicarlo con .map() o .replace().

import pandas as pd

df = pd.DataFrame({
    'country': ['US', 'USA', 'United States', 'uk', 'UK', 'United Kingdom']
})

canonical = {
    'US': 'United States', 'USA': 'United States', 'United States': 'United States',
    'uk': 'United Kingdom', 'UK': 'United Kingdom', 'United Kingdom': 'United Kingdom'
}

df['country_clean'] = df['country'].map(canonical)
print(df['country_clean'].tolist())
# ['United States', 'United States', 'United States',
#  'United Kingdom', 'United Kingdom', 'United Kingdom']

Eliminar espacios y estandarizar mayúsculas y minúsculas

Antes de comparar o agrupar columnas de texto, siempre elimine los espacios en blanco y normalice las mayúsculas y minúsculas como primer paso de limpieza. Pandas trata como diferentes dos valores que para una persona parecen iguales (' Active' y 'active'), debido al espacio inicial y a la diferencia entre mayúsculas y minúsculas. Una cadena de dos pasos —eliminar espacios y después convertir a minúsculas— resuelve ambos problemas.

import pandas as pd

df = pd.DataFrame({
    'status': ['  Active', 'INACTIVE', 'active ', ' Pending  ', 'ACTIVE']
})

df['status_clean'] = df['status'].str.strip().str.lower()
print(df['status_clean'].value_counts())
# active      3
# inactive    1
# pending     1

Coincidencia difusa para corregir errores tipográficos

Cuando los errores tipográficos impiden las coincidencias exactas, la coincidencia difusa calcula puntuaciones de similitud entre cadenas. La biblioteca rapidfuzz (o la clásica fuzzywuzzy) proporciona coincidencias difusas vectorizadas. Un flujo de trabajo habitual consiste en buscar, para cada valor incorrecto único, el valor canónico más cercano que supere un umbral de similitud y crear un mapa de correcciones.

# Conceptual example (requires: pip install rapidfuzz)
from rapidfuzz import process

canonical_cities = ['New York', 'Los Angeles', 'Chicago', 'Houston']
dirty_values = ['New Yrok', 'Los Angelas', 'Chicagoo']

for dirty in dirty_values:
    best, score, _ = process.extractOne(dirty, canonical_cities)
    print(f'{dirty!r} -> {best!r} (score={score:.0f}%)')
# 'New Yrok'   -> 'New York'    (score=91%)
# 'Los Angelas'-> 'Los Angeles' (score=96%)
# 'Chicagoo'   -> 'Chicago'     (score=94%)

Dividir celdas con varios valores mediante explode()

A veces una celda contiene varios valores separados por un delimitador (por ejemplo, 'python,sql,pandas'). Divida la columna para obtener listas y, después, llame a .explode() para crear una fila por cada valor. Esto convierte una celda ancha y compactada en un formato largo ordenado, en el que cada fila tiene exactamente un valor, algo necesario para realizar operaciones de groupby y join sobre esos valores.

import pandas as pd

df = pd.DataFrame({
    'user_id': [1, 2, 3],
    'skills': ['python,sql', 'java,kotlin,sql', 'python']
})

df['skills'] = df['skills'].str.split(',')
exploded = df.explode('skills')
print(exploded)
#    user_id   skills
# 0        1   python
# 0        1      sql
# 1        2     java
# 1        2   kotlin
# 1        2      sql
# 2        3   python

Gestión de texto con codificaciones mixtas

Los datos de texto procedentes de distintas fuentes pueden presentar problemas de codificación: caracteres extraños como \xa0 (espacio de no separación), \u2019 (apóstrofo tipográfico) o caracteres acentuados ilegibles. Utilice .str.encode('ascii', errors='replace').str.decode('ascii') para una limpieza rápida limitada a ASCII, o .str.normalize('NFKD') para descomponer los acentos antes de eliminarlos.

import pandas as pd
import unicodedata

df = pd.DataFrame({'name': ['Caf\u00e9', 'na\u00efve', 'r\u00e9sum\u00e9']})

# Normalize and strip accents (NFKD decomposition + ascii encoding)
df['name_ascii'] = (
    df['name']
    .str.normalize('NFKD')
    .str.encode('ascii', errors='ignore')
    .str.decode('ascii')
)
print(df)
#       name name_ascii
# 0     Cafe       Cafe
# 1    naive      naive
# 2   resume     resume

Crear claves compuestas

En muchos conjuntos de datos es necesario crear una clave compuesta a partir de varias columnas para identificar de forma única una fila en operaciones de combinación o eliminación de duplicados. Combinar columnas de texto ya limpiadas (sin espacios, en minúsculas y normalizadas) en una sola cadena de clave garantiza coincidencias coherentes entre fuentes de datos en las que la misma entidad puede estar escrita de forma ligeramente diferente.

import pandas as pd

df = pd.DataFrame({
    'first': ['  Alice', 'BOB', ' Carol'],
    'last': ['Smith ', 'JONES', 'White  '],
    'dob': ['1990-01-15', '1985-07-22', '1992-11-30']
})

df['match_key'] = (
    df['first'].str.strip().str.lower() + '|' +
    df['last'].str.strip().str.lower() + '|' +
    df['dob']
)
print(df['match_key'].tolist())
# ['alice|smith|1990-01-15', 'bob|jones|1985-07-22', 'carol|white|1992-11-30']

Aplicar una lista canónica de categorías

Después de la limpieza, compruebe que todos los valores de una columna de texto categórica pertenezcan a un conjunto canónico conocido. Cualquier valor que no pertenezca al conjunto puede indicar una categoría nueva y válida o un error en los datos. Registre o marque los valores desconocidos para revisarlos manualmente en lugar de eliminarlos silenciosamente, para que nada pase desapercibido.

import pandas as pd

df = pd.DataFrame({
    'status': ['active', 'inactive', 'active', 'archived', 'unknown_status']
})

canonical = {'active', 'inactive', 'archived'}

unknown = df[~df['status'].isin(canonical)]['status'].unique()
print('Unknown statuses:', unknown.tolist())
# ['unknown_status']

# Flag unknown rows
df['status_valid'] = df['status'].isin(canonical)
print(df)

Flujo completo de limpieza de texto

A continuación se muestra un flujo completo de limpieza de texto que aplica todas las técnicas de esta lección: eliminar espacios en blanco, normalizar mayúsculas y minúsculas, corregir abreviaturas, eliminar caracteres especiales y validar con respecto a una lista canónica. Este es el tipo de función reutilizable que añadiría a cualquier módulo de ingesta de datos.

import pandas as pd

def clean_category_column(series, canonical_map, canonical_set):
    cleaned = (
        series
        .str.strip()
        .str.lower()
        .map(lambda x: canonical_map.get(x, x))  # fix known variants
    )
    unknown = cleaned[~cleaned.isin(canonical_set)]
    if not unknown.empty:
        print('Warning: unknown values:', unknown.unique().tolist())
    return cleaned

cmap = {'eng': 'engineering', 'hr': 'human_resources', 'mktg': 'marketing'}
cset = {'engineering', 'human_resources', 'marketing', 'finance'}

df = pd.DataFrame({'dept': ['Eng', 'HR', 'Marketing', 'MKTG', 'Legal']})
df['dept_clean'] = clean_category_column(df['dept'], cmap, cset)
print(df)

Comprobación rápida

Compruebe si ha entendido cómo combinar y limpiar columnas de texto.

Resumen de la lección

En esta lección ha aprendido a: concatenar columnas con el operador + después de convertir los valores numéricos en cadenas, utilizar str.cat(sep=) para unir valores con un delimitador y gestionar los valores NaN, aplicar un mapa canónico con .map() para normalizar etiquetas incoherentes y utilizar explode() para expandir celdas con listas en varias filas. Aplique conjuntos canónicos para detectar pronto los problemas de calidad de los datos. A continuación, ordenaremos DataFrames por los valores de sus columnas.

Preguntas frecuentes

¿La lección «Combinar y limpiar columnas de texto» es gratis?

Sí — el texto completo de «Combinar y limpiar columnas de texto» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Combinar y limpiar columnas de texto»?

Concatene varias columnas en una sola cadena, elimine los espacios en blanco y normalice las etiquetas de categoría inconsistentes. Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Pandas & NumPy Academy?

No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Combinar y limpiar columnas de texto»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?

Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. El accessor .str
  2. Dividir y reemplazar cadenas
  3. Coincidencia de patrones con regex
  4. Combinar y limpiar columnas de texto
← Volver a Pandas & NumPy Academy