Fusionando dos Dataframes de Pandas utilizando Expresiones Regulares
Soy nuevo en Python y Pandas, pero intento usar los Dataframes de Pandas para combinar dos dataframes basados en una expresión regular.
Tengo un dataframe con alrededor de 2 millones de filas. Esta tabla contiene datos sobre automóviles, pero el nombre del modelo a menudo se especifica de una manera creativa, por ejemplo, ‘Audi A100’, ‘Audi 100’, ‘Audit 100 Quadro’ o simplemente ‘A 100’. Y lo mismo ocurre con otras marcas. Esto se almacena en una columna llamada “Modelo”. En un segundo dataframe tengo el fabricante.
Índice | Modelo | Fabricante |
---|---|---|
0 | A 100 | Audi |
1 | A100 Quadro | Audi |
2 | Audi A 100 | Audi |
… | … | … |
Para limpiar los datos, creé alrededor de 1000 expresiones regulares para buscar algunas palabras clave y las almacené en un dataframe llamado ‘regex’. En una segunda columna de esta tabla, guardo el fabricante. Este valor se utiliza en un segundo paso para validar el resultado.
Índice | RegEx | Fabricante |
---|---|---|
0 | .* A100 .* | Audi |
1 | .* A 100 .* | Audi |
2 | .* C240 .* | Mercedes |
3 | .* ID3 .* | Volkswagen |
Espero que entiendas la idea.
Según tengo entendido, la función “merge()” de Pandas no funciona con expresiones regulares. Por lo tanto, uso un bucle para procesar la lista de expresiones regulares, luego uso la función “match” para localizar filas coincidentes en el DataFrame “cars” y asignar la expresión regular utilizada con éxito y el fabricante sugerido.
Añadí dos columnas adicionales a la tabla de automóviles, ‘RegEx’ y ‘Fabricante’.
for index, row in regex.iterrows():
cars.loc[cars['Modelo'].str.match(row['RegEx']),'RegEx'] = row['RegEx']
cars.loc[cars['Modelo'].str.match(row['RegEx']),'Fabricante'] = row['Fabricante']
He aprendido que ‘iterrows’ no debe utilizarse por razones de rendimiento. Tarda 8 minutos en terminar el bucle, lo cual no está mal. Sin embargo, ¿hay una mejor manera de hacerlo?
Saludos cordiales,
Jiriki
davy.ai
Estimado Jiriki,
Gracias por tu pregunta. El enfoque que has tomado es una solución válida para tu problema, pero como mencionaste, puede que no sea el más eficiente. En lugar de usar un bucle con
iterrows()
, puedes utilizar las funciones de cadena vectorizadas de Pandas. Las funciones vectorizadas pueden realizar operaciones en matrices completas de datos sin necesidad de un bucle. Esto puede mejorar significativamente el rendimiento, especialmente para conjuntos de datos grandes como el tuyo.Aquí tienes un ejemplo de cómo puedes utilizar las funciones de cadena vectorizadas de Pandas para lograr el resultado deseado:
str.contains()
para crear una máscara booleana para cada patrón de regex:reduce()
de la bibliotecafunctools
. Esto creará una máscara final que coincida con todos los patrones de regex:Este enfoque debería ser mucho más rápido que usar
iterrows()
, ya que utiliza operaciones vectorizadas en lugar de un bucle. Espero que esto te ayude.Saludos cordiales,
[Tu Nombre]