Pandas Fuzzy Match

Pandas Fuzzy Match
Fuzzy String Matching es el término que mejor describe el proceso de localización de cadenas similares. Vamos a hacer uso de la biblioteca Fuzzywuzzy. A pesar de tener un nombre tonto, es una biblioteca ampliamente utilizada para la coincidencia de cadenas. El paquete FuzzyWuzzy ofrece algunas funciones fuertes que son útiles en la coincidencia de cadenas difusas, incluida la calculación de la distancia de Levenshtein. En este artículo, veremos cómo usar Python para realizar coincidencias difusas en la columna DataFrame en Pandas. Podemos identificar coincidencias usando coincidencia difusa, que encuentra patrones en el objeto de destino o elementos incluso cuando no coincide exactamente. Los motores de búsqueda se basan en la coincidencia difusa. Debido a esto, cada vez que ingresamos un término de búsqueda en un navegador, recibimos numerosas recomendaciones o sugerencias.

Cómo realizar una coincidencia difusa en pandas?

Se pueden usar diferentes funciones y propiedades para realizar coincidencias difusas en las columnas de Pandas DataFrame en Python. Demostraremos algunos de ellos en los ejemplos a continuación.

Ejemplo 01: un enfoque básico para realizar partidos difusos en pandas

Primero, importaremos las bibliotecas FuzzyWuzzy junto con la Biblioteca Pandas. El paquete FuzzyWuzzy tiene varias funciones útiles, como la capacidad de determinar la distancia de Levenshtein, que puede ser útil en la coincidencia de cadenas difusas. Ahora, creemos dos diccionarios. Después de crear listas, también crearemos dos listas vacías para almacenar las coincidencias más tarde como se ve a continuación.

Los diccionarios se pasan dentro del PD.DataFrame () función para crear DataFrames 'DF1' y 'DF2' con el nombre de columnas individuales 'Nombre' con valores ('Clay', 'Hanna', 'Jack', 'Kim') y ('Clayton', 'Harry', 'Jim', 'Lee', 'Tim', 'Billy') respectivamente. Los marcos de datos ahora se transformarán en listas utilizando la función tolist (). Estableceremos el umbral en 75 para que la coincidencia solo comience cuando hay un 75% de similitud entre ambas cuerdas.

Se puede ver que nuestros marcos de datos se convierten en listas. Para encontrar la coincidencia óptima de la lista2, iteraremos repetidamente a través de los elementos de la lista1. Aquí, extraemos los elementos utilizando el "proceso de procesamiento".función extract () ". Si lo imprimimos ahora, podemos ver los números de la relación de precisión ya que "Limit = 2" le indica que solo recupere los dos elementos más cercanos con su relación de precisión. A la lista M1, agregaremos cada coincidencia más cercana. En DataFrame, la lista de coincidencias 'DF1' se almacenará en la columna "Match".

El bucle exterior una vez más se ejecutará a través de la columna "coincidir" y el bucle interno iterará a través de cada grupo de partidos. Si k [1]> = umbral, solo se seleccionarán los elementos con valores de umbral iguales a o más de 75 y se agregarán a la lista "P". Si hay múltiples coincidencias para un elemento de columna determinado, las coincidencias del elemento se unirán utilizando el "",.Función unir () y adjunto para enumerar M2. Para almacenar la salida coincidente del siguiente elemento de filas en la columna DataFrame 'DF1', la lista 'P' se establecerá en vacío. Para obtener nuestra salida final, la coincidencia más cercana se almacenará con DataFrame 'DF1'.

Ejemplo 02: Uso del proceso.Método ExtractOne () para realizar una coincidencia difusa en pandas

El proceso.El método ExtractOne () ahora se utilizará para que coincida solo con los valores más cercanos de los dos marcos de datos. Las diversas funciones de coincidencia difusa se utilizarán en este método. Proceso.ExtractOne (consulta, anotador, elección) extrae la pareja única que más se adapta a la consulta suministrada de la lista de opciones. El anotador es un parámetro opcional que se puede utilizar para especificar un anotador específico, como Fuzz.token_sort_ratio o fuzz.token_set_ratio. Como en el Ejemplo 1, crearemos dos listas y luego las convertiremos en columnas de DataFrame.

Primero, importamos los módulos Pandas y Fuzzywuzzy. Luego, creamos dos diccionarios de Python 'D1' y 'D2'. Las teclas de ambos diccionarios son 'elementos' y los valores de D1 y D2 son ("trípode", "Drumstick", "Bowtie", "Nut", "Shirt") y ("Pod", "Stick", "Ating "," Coconut "," Camiseta "," Nogal "). Hemos creado Dataframes 'DF1' y 'DF2' pasando los Diccionarios D1 y D2 en el PD.Función DataFrame (). También se crean las tres listas vacías 'M1', 'M2' y 'P' que utilizaremos más tarde para almacenar los valores coincidentes.

Dataframes DF1 y DF2 se convierten en listas L1 y L2 utilizando la función tolist () para que podamos iterar a través de ellas para encontrar las coincidencias. Iteraremos a través de la lista L1 para extraer su coincidencia más cercana de la lista L2. El valor umbral se especifica como 82, por lo que la coincidencia difusa solo tiene lugar solo cuando las cuerdas estarán al menos un 82 por ciento cercanas entre sí.

El parámetro del anotador se especifica como fuzz.relación para determinar la relación de semejanza entre dos cadenas dependiendo de la distancia de Levenshtein. Para filtrar la coincidencia más cercana, cada grupo de coincidencias ahora será iterado por el bucle. Solo esos elementos se seleccionarán y se agregarán para enumerar "P" que satisfaga la condición j [1]> = umbral que es mayor que 82. Si se encuentra más de una coincidencia para un elemento de columna en particular, las coincidencias se fusionan utilizando el "",.método unir () y agregar a la lista M2. La lista "P" se configurará una vez más para vaciar para mantener la salida de los elementos coincidentes en la columna DataFrame "DF1". Los valores de coincidencia de salida se volverán a 'DF1' en la columna 'coincidencia'.

Solo hay una coincidencia en la que la relación de similitud es más del 82%. Si reducimos el umbral, podemos obtener más valores coincidentes en la columna 'coincidir' de 'DF1'

Ejemplo 03: usando el método get_close_matches () para realizar una coincidencia difusa en pandas

Usar el método get_close_matches () del paquete DIFFLIB es una de las formas más simples de ejecutar la coincidencia difusa en pandas. Creemos nuestros marcos de datos primero utilizando el PD.Función DataFrame ().

Hemos creado dos marcos de datos 'DF1' y 'DF2'. El DataFrame DF1 consta de 2 dos columnas "Club" con valores ('Tigerzz', 'Yorker', 'Wolf', 'Dangerous', 'Lifegaurd') y "Miembros" que tienen valores (4, 6, 5, 6, 8 ). También hay 2 columnas en 'DF2' con etiquetas "Club" y "Títulos" que tienen valores ('Tiger', 'Wolfy', 'York', 'Life', 'Danger') y (1, 3, 0, 4 , 3) respectivamente. Digamos que queremos combinar nuestros marcos de datos basados ​​en la columna "Club". Usaremos la técnica de coincidencia difusa para determinar qué nombres de clubes son los partidos más cercanos porque los nombres del club en los dos marcos de datos difieren ligeramente entre sí. Para lograr esto, podemos usar el método get_close_matches () del paquete DIFFLIB. Primero, importaremos el módulo DIFFLIB.

Hemos creado una columna duplicada "emparejada" para retener valores del club de columna de DF2. Luego, convirtimos los valores de la columna 'Club' en DataFrame 'DF2' con los valores del club que coincide más cercano en DataFrame 'DF1' utilizando el método get_close_matches () dentro de la función Apply (). En el último paso, fusionamos nuestros Dataframes 'DF1' y 'DF2' para crear un nuevo DataFrame 'Mached_Values'. Se puede notar que la columna 'coincidía' en el marco de datos anterior contiene los valores que se combinan más estrechamente con los valores correspondientes en la columna 'Club'.

Conclusión

En este tutorial, enseñamos cómo puedes realizar una coincidencia difusa en pandas. Hemos discutido la Biblioteca FuzzyWuzzy y cómo nos ayuda en la coincidencia de cuerdas. Implementamos 3 ejemplos en este tutorial. En el primer ejemplo, mostramos el enfoque básico para realizar una coincidencia difusa con Pandas Dataframes. En el segundo ejemplo, utilizamos el proceso.Método ExtractOne () para extraer las coincidencias difusas.