Operaciones de cadenas en Pandas
Pandas ofrece potentes funciones de procesamiento de cadenas; mediante el.straccessor se puede procesar cada elemento de un Series de la misma manera que las cadenas de Python.
Descripción general del accessor str
Cuando el tipo de datos del Series esobject, se puede utilizar el.straccessor para realizar operaciones de cadenas.
Ejemplo
# Crear un Series con cadenas
s = pd.Series(["hello", "world", "pandas", "Python"])
print("Series original:")
print(s)
print()
# Convertir a minúsculas
print("Minúsculas:")
print(s.str.lower())
print()
# Convertir a mayúsculas
print("Mayúsculas:")
print(s.str.upper())
print()
# Poner la primera letra en mayúscula
print("Primera letra en mayúscula:")
print(s.str.capitalize())
Funciones de cadena comunes
Conversión de mayúsculas y minúsculas
| Método | Descripción | Ejemplo |
|---|---|---|
str.lower() |
Convertir a minúsculas | "Hello" → "hello" |
str.upper() |
Convertir a mayúsculas | "Hello" → "HELLO" |
str.title() |
Poner la primera letra en mayúscula | "hello world" → "Hello World" |
str.capitalize() |
Primera letra en mayúscula, el resto en minúsculas | "hELLO" → "Hello" |
str.swapcase() |
Intercambiar mayúsculas y minúsculas | "HeLLo" → "hEllO" |
Búsqueda y reemplazo de cadenas
Ejemplo
s = pd.Series(["hello world", "python pandas", "data science", "machine learning"])
print("Datos originales:")
print(s)
print()
# Comprobar si contiene
print("Contiene 'python':")
print(s.str.contains("python", case=False))
print()
# Comprobar inicio/fin
print("Empieza con 'hello':")
print(s.str.startswith("hello"))
print()
# Reemplazar
print("Reemplazar espacios por guiones bajos:")
print(s.str.replace(" ", "_"))
print()
# Dividir
print("Dividir por espacios:")
print(s.str.split(" "))
Eliminación de espacios y relleno
Ejemplo
s = pd.Series([" hello ", "world ", " pandas", " python "])
print("Datos originales:")
print(s)
print()
# Eliminar espacios al inicio y al final
print("Sin espacios al inicio y al final:")
print(s.str.strip())
print()
# Eliminar espacios a la izquierda
print("Sin espacios a la izquierda:")
print(s.str.lstrip())
print()
# Eliminar espacios a la derecha
print("Sin espacios a la derecha:")
print(s.str.rstrip())
print()
# Rellenar
print("Rellenar con 0 a la izquierda hasta longitud 10:")
print(s.str.pad(10, side="left", fillchar="0"))
Segmentación y concatenación
Ejemplo
s = pd.Series(["hello", "world", "python", "pandas"])
print("Datos originales:")
print(s)
print()
# Segmentar
print("Primeros 3 caracteres:")
print(s.str[:3])
print()
# Tomar 3 caracteres desde la posición 1
print("Tomar 3 desde la posición 1:")
print(s.str[1:4])
print()
# Concatenación de cadenas
s1 = pd.Series(["Hello", "World"])
s2 = pd.Series(["Python", "Pandas"])
print("Concatenación con +:")
print(s1 + " " + s2)
print()
# Unión con join (usando el separador especificado)
print("Unión con join:")
print(s1.str.cat(s2, sep="-"))
Soporte de expresiones regulares
Las funciones de cadena de Pandas admiten expresiones regulares, una herramienta poderosa para manejar patrones de cadenas complejos.
Ejemplo
s = pd.Series([
"[email protected]",
"[email protected]",
"invalid-email",
"[email protected]"
])
print("Datos originales:")
print(s)
print()
# Extraer el correo electrónico
print("Extraer nombre de usuario:")
print(s.str.extract(r"(\w+)@"))
print()
print("Extraer dominio:")
print(s.str.extract(r"@(\w+\.\w+)"))
print()
# Reemplazar
print("Reemplazar el correo por [email]:")
print(s.str.replace(r"\w+@\w+\.\w+", "[email]", regex=True))
print()
# Coincidencia de contenido
print("Contiene .com o .org:")
print(s.str.contains(r"\.com|\.org"))
Extracción y división
Ejemplo
s = pd.Series(["2024-01-01", "2024-02-15", "2024-03-20"])
print("Datos originales:")
print(s)
print()
# Extraer año, mes y día
extract_df = s.str.extract(r"(\d{4})-(\d{2})-(\d{2})")
extract_df.columns = ["año", "mes", "día"]
print("Extraer año, mes y día:")
print(extract_df)
print()
# Dividir por separador
s2 = pd.Series(["a,b,c", "d,e,f", "g,h,i"])
print("Dividir por comas:")
print(s2.str.split(","))
print()
# Dividir y expandir en un DataFrame
print("Dividir y expandir:")
print(s2.str.split(",", expand=True))
Estadísticas y conversión
Longitud y conteo
Ejemplo
s = pd.Series(["hello", "world", "python", "pandas"])
print("Datos originales:")
print(s)
print()
# Longitud de la cadena
print("Longitud de la cadena:")
print(s.str.len())
print()
# Conteo de caracteres
s2 = pd.Series(["hello", "world", "aaa", "bbb"])
print("Número de apariciones del carácter 'l':")
print(s2.str.count("l"))
Conversión de tipos
Ejemplo
# Convertir cadena a numérico
s = pd.Series(["1", "2", "3", "abc"])
print("Cadena a numérico:")
print(pd.to_numeric(s, errors="coerce"))
print()
# Convertir numérico a cadena
s2 = pd.Series([1, 2, 3, 4])
print("Numérico a cadena:")
print(s2.astype(str).str.zfill(4)) # Rellenar con ceros hasta 4 dígitos
Práctica: limpieza de datos
Ejemplo
import numpy as np
# Simular datos sucios
df = pd.DataFrame({
"Nombre": [" Juan ", "Ana", "Luis "],
"Teléfono": ["138-0000-0000", "13900000000", " 010-12345678 "],
"Email": ["[email protected]", "[email protected]", "[email protected] "]
})
print("Datos originales:")
print(df)
print()
# Pasos de limpieza
# 1. Eliminar espacios
df["Nombre"] = df["Nombre"].str.strip()
df["Teléfono"] = df["Teléfono"].str.replace("-", "").str.strip()
df["Email"] = df["Email"].str.strip().str.lower()
print("Después de la limpieza:")
print(df)
print()
# 2. Validar los datos
print("Validación del email:")
print(df["Email"].str.contains(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
Consideraciones
1. Manejo de valores faltantes
Las operaciones de cadena omiten los valores faltantes (NaN) de forma predeterminada; si necesita manejarlos, puede usar.fillna()para rellenarlos primero.
2. Sensibilidad a mayúsculas y minúsculas
La mayoría de las funciones distinguen entre mayúsculas y minúsculas de forma predeterminada; use elcase=Falseparámetro para realizar coincidencias sin distinguir entre mayúsculas y minúsculas.
3. Rendimiento de las expresiones regulares
Las expresiones regulares son potentes pero relativamente lentas; preste atención al rendimiento al procesar grandes volúmenes de datos.
Otras extensionesEl procesamiento de cadenas es una parte importante de la limpieza de datos; usar adecuadamente el
.straccessor permite completar de manera eficiente la mayoría de las tareas de procesamiento de texto.