Cómo buscar y reemplazar texto con expresiones regulares en pandas

Publicado el 11 noviembre 2024 por Daniel Rodríguez @analyticslane

El análisis y limpieza de datos son tareas clave para el éxito en cualquier proyecto de análisis de datos. En el caso de que algunos de los datos a analizar sean de tipo texto, las expresiones regulares se vuelven una herramienta imprescindible para poder manipular estos de forma precisa y eficiente. Tarea que se puede realizar directamente en Pandas. En Python, la biblioteca Pandas permite trabajar con datos estructurados, y gracias a sus métodos para trabajar con texto y expresiones regulares, se pueden realizar transformaciones complejas de una manera sencilla y directa. En esta entrada, se verá cómo se utilizan expresiones regulares en Pandas para realizar tareas de búsqueda y reemplazo en texto, explorando algunas de las opciones más útiles. Para esto se recurrirá a los métodos str.contains() y str.replace(), los cuales permiten buscar, identificar y modificar elementos de un DataFrame según patrones específicos.

¿Qué son las expresiones regulares?

Las expresiones regulares, también conocidas como regex, son patrones que describen secuencias de caracteres. Estos patrones pueden utilizarse para encontrar coincidencias en textos y realizar operaciones como buscar, extraer o reemplazar partes del texto. Siendo especialmente útiles en tareas de limpieza y manipulación de datos. Lo que facilita trabajar con grandes volúmenes de texto sin tener que procesar manualmente cada elemento.

Algunos de los patrones básicos que se pueden usar en expresiones regulares incluyen:

  • \d: Coincide con cualquier dígito (0-9).
  • \w: Coincide con cualquier carácter alfanumérico (letras y números).
  • \s: Coincide con espacios en blanco (espacios, tabulaciones).
  • +: Indica una o más ocurrencias del patrón anterior.
  • *: Indica cero o más ocurrencias del patrón anterior.
  • []: Define un conjunto de caracteres permitidos (por ejemplo, [aeiou] para vocales).

Estos patrones se pueden combinar en las columnas de los DataFrame de Pandas mediante los métodos str.contains() y str.replace(). Los cuales, respectivamente, permiten detectar y reemplazar patrones de texto de manera eficiente.

Cómo usar expresiones regulares en pandas

Pandas proporciona métodos específicos para trabajar con datos de texto, entre los cuales se encuentran str.contains() y str.replace(). A continuación, se mostrará cómo utilizar estos métodos.

    Buscar un patrón específico en una columna. Con str.contains(), se puede comprobar si una columna contiene ciertos patrones en cada fila. Este método es útil cuando se desea filtrar un DataFrame en función de si un patrón está presente en una columna de texto.
# Filtrar filas donde la columna 'col1' contiene números
df[df['col1'].str.contains(r'\d+', regex=True)]

En este ejemplo, el patrón \d+ busca filas que contienen uno o más dígitos en la columna col1. Esta búsqueda no cambia el contenido, sino que permite seleccionar o identificar las filas que cumplen con el criterio.

    Reemplazar un patrón en una columna. str.replace() es el método ideal cuando se necesita eliminar o reemplazar partes específicas del texto en una columna. Por ejemplo, si se desea eliminar todos los dígitos de una columna, es posible usar la siguiente expresión:
# Eliminar todos los números de la columna 'col1'
df['col1'] = df['col1'].str.replace(r'\d+', '', regex=True)

Aquí, \d+ coincide con uno o más dígitos en cada valor de col1, y los reemplaza con una cadena vacía (''). Esto es muy útil cuando se necesita limpiar datos de texto que incluyen información no deseada, como códigos o números.

Ejemplos prácticos de uso de expresiones regulares en pandas

A continuación, se muestran tres ejemplos donde el uso de expresiones regulares en Pandas es especialmente útil para la limpieza de datos.

Ejemplo 1: Eliminar caracteres especiales de una columna de texto

Si se tiene una columna en un DataFrame que contiene nombres, pero con caracteres especiales no deseados (por ejemplo, puntuaciones como !, @, y #). Para limpiar esta columna y eliminar todos los caracteres especiales, se puede recurrir al siguiente código:

# Eliminar caracteres especiales de la columna 'names'
df['names'] = df['names'].str.replace(r'[!@#\$%\^&\*\(\)]', '', regex=True)

En este ejemplo, el patrón [!@#\$%\^&\*\(\)] coincide con los caracteres especiales indicados anteriormente y los elimina de cada valor de la columna names. Esto es útil para limpiar nombres, direcciones y otros datos textuales que contienen caracteres no deseados.

Ejemplo 2: Extraer números de una columna de texto

En algunos casos, solo es necesario extraer los números de una columna de texto. Supóngase el caso de un DataFrame con una columna que contiene direcciones de la que solamente se dese extraer el número de la calle. Esto se puede hacer usando el método str.extract(), que funciona de manera similar a str.replace(), pero en lugar de eliminar el patrón, lo extrae.

# Extraer números de la columna 'address'
df['street_number'] = df['address'].str.extract(r'(\d+)', expand=False)

El patrón \d+ encuentra los números en la columna address y crea una nueva columna, street_number, con el número de la calle. Esta técnica es útil para tareas como extraer códigos postales, números de teléfono o identificadores numéricos de datos textuales.

Ejemplo 3: Formatear números de teléfono

Ahora supóngase que se dispone de una columna que contiene números de teléfono en diferentes formatos y se desea estandarizarlos. Para ello se puede recurrir al método str.replace(), con el cual es posible dar formato a los números con un patrón consistente. Por ejemplo:

# Estandarizar números de teléfono
df['phone'] = df['phone'].str.replace(r'\D', '', regex=True)  # Eliminar caracteres no numéricos
df['phone'] = df['phone'].str.replace(r'(\d{3})(\d{3})(\d+)', r'\1 \2 \3', regex=True)

En este caso, primero elimina todos los caracteres no numéricos con \D (cualquier cosa que no sea un dígito). Luego se usa el patrón (\d{3})(\d{3})(\d+) para capturar las partes del número de teléfono y darles formato. Por ejemplo, un número como 123456789 se convertirá en 123 456 789, creando una representación estándar para todos los números de teléfono en el DataFrame.

Conclusiones

El uso de expresiones regulares en pandas permite realizar la limpieza y transformación de datos de columnas de texto de una forma rápida y eficiente. Permitiendo resolver desde problemas sencillos, como la eliminación de caracteres no deseados en los textos, hasta tareas mucho más avanzadas, como aplicar un formato específico para diferentes textos. Conocer y aplicar las expresiones regulares en Pandas puede hacer mucho más sencillo el trabajo de limpieza de datos.