Coincidencia difusa de pandas

Salman Mehmood 15 febrero 2024
Coincidencia difusa de pandas

Este artículo enseña cómo fusionar marcos de datos y cómo aplicar la coincidencia aproximada para comparar los marcos de datos de dos pandas en Python.

Aplicar Fuzzy Match en Pandas Data Frame en Python

Supongamos que tenemos el siguiente caso de uso con dos tablas diferentes y queremos fusionarlas en una columna común; mira un ejemplo.

Tenemos df1, el primer marco de datos, y df2, el segundo marco de datos, y ambos contienen la columna Company_Name. Por ejemplo, vea el siguiente bloque de código.

import pandas as pd

df1 = [
    "Amazing Art Inc.",
    "Amazing Ants Ltd.",
    "Beautiful Buildings Inc.",
    "Clean Communication Inc.",
    "Dramatic Dramas Ltd.",
]
df2 = [
    "Amazing art gnc.",
    "Amazing Aant Ltd.",
    "Beautiful Buildings Inc",
    "Clear Communication Inc.",
    "Pramatic Dramas Inc.",
]

df1 = pd.DataFrame(df1, columns=["Company_Name"])
df2 = pd.DataFrame(reversed(df2), columns=["Company_Name"])

Cuando los comparemos, veremos que son nombres bastante similares, pero no son precisamente idénticos, como tenemos Amazing Art Inc., y en otro marco de datos, tenemos Amazing Art gnc.. Se realizan pocos cambios en otros elementos.

Cuando trabajamos con datos de la vida real, no podemos hacer coincidir estos elementos; afortunadamente, hay una solución utilizando la biblioteca fuzzywuzzy. Ahora veremos cómo instalar esta biblioteca en Jupyter porque estamos usando el cuaderno Jupyter.

Importaremos la biblioteca sys y usaremos el ejecutable dentro de las llaves, y delante de este, escribiremos un comando.

import sys
!{sys.executable} -m pip install fuzzywuzzy

Producción :

Collecting fuzzywuzzy
  Downloading fuzzywuzzy-0.18.0-py2.py3-none-any.whl (18 kB)
Installing collected packages: fuzzywuzzy
Successfully installed fuzzywuzzy-0.18.0

Después de instalar con éxito, cargamos la función y el módulo necesarios de la biblioteca fuzzywuzzy.

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

Ahora usaremos la función extractOne() del proceso para mostrar cómo funciona, y solo devolverá la coincidencia más probable que encontró. Entonces, por ejemplo, queremos hacer coincidir Beautiful Bldgfs y luego compararlo con df1 usando el nombre de la columna.

process.extractOne("Beautiful Bldgfs", df1["Company_Name"])

Como podemos ver, devuelve Beautiful Buildings Inc., y 77 es una estimación o confianza de que esta es la coincidencia correcta. Y en el último valor numérico, 2 muestra qué posición tiene en el marco de datos.

('Beautiful Buildings Inc.', 77, 2)

Para comparar el marco de datos completo para todas las columnas, crearíamos una nueva columna, cargaríamos la columna Company_Name desde df1 y la mapearíamos usando la función map(). Usando la función lambda llamamos extractOne().

Dentro de esta función, ponemos df2 y revisamos la columna para encontrar la coincidencia más cercana, y luego, podríamos usar índices porque devuelve una tupla, y solo queremos devolver la primera entrada de la tupla.

Después de llamar a df1, vemos que obtuvimos las coincidencias más cercanas para todas las entradas.

df1["Best_Match"] = df1["Company_Name"].map(
    lambda x: process.extractOne(x, df2["Company_Name"])[0]
)
df1

Producción:

coincidencia aproximada de pandas - salida

Aquí está el código Python completo para el ejemplo anterior.

from fuzzywuzzy import fuzz
from fuzzywuzzy import process
import pandas as pd


df1 = [
    "Amazing Art Inc.",
    "Amazing Ants Ltd.",
    "Beautiful Buildings Inc.",
    "Clean Communication Inc.",
    "Dramatic Dramas Ltd.",
]
df2 = [
    "Amazing art gnc.",
    "Amazing Aant Ltd.",
    "Beautiful Buildings Inc",
    "Clear Communication Inc.",
    "Pramatic Dramas Inc.",
]


df1 = pd.DataFrame(df1, columns=["Company_Name"])
df2 = pd.DataFrame(reversed(df2), columns=["Company_Name"])

print(process.extractOne("Beautiful Bldgfs", df1["Company_Name"]))

df1["Best_Match"] = df1["Company_Name"].map(
    lambda x: process.extractOne(x, df2["Company_Name"])[0]
)
print(df1)
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn