Pandas Fuzzy-Match

Salman Mehmood 15 Februar 2024
Pandas Fuzzy-Match

In diesem Artikel erfahren Sie, wie Sie Datenrahmen zusammenführen und wie Sie den Fuzzy-Match anwenden, um die Datenrahmen zweier Pandas in Python zu vergleichen.

Wenden Sie Fuzzy Match auf Pandas Data Frame in Python an

Angenommen, wir haben den folgenden Anwendungsfall mit zwei verschiedenen Tabellen, und wir möchten sie in einer gemeinsamen Spalte zusammenführen; schau dir ein beispiel an.

Wir haben df1, den ersten Datenrahmen, und df2, den zweiten Datenrahmen, und beide enthalten die Spalte Company_Name. Siehe beispielsweise den folgenden Codeblock.

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"])

Wenn wir sie vergleichen, werden wir sehen, dass es sich um ziemlich ähnliche Namen handelt, aber sie sind nicht genau identisch, wie zum Beispiel Amazing Art Inc., und in einem anderen Datenrahmen haben wir Amazing Art gnc.. An anderen Artikeln werden nur wenige Änderungen vorgenommen.

Wenn wir mit realen Daten arbeiten, können wir diese Elemente nicht abgleichen; Glücklicherweise gibt es eine Lösung mit der Bibliothek fuzzywuzzy. Jetzt werden wir sehen, wie diese Bibliothek in Jupyter installiert wird, da wir das Jupyter-Notebook verwenden.

Wir importieren die sys-Bibliothek und verwenden die ausführbare Datei in den geschweiften Klammern, und davor schreiben wir einen Befehl.

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

Ausgang:

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

Nach erfolgreicher Installation laden wir die benötigte Funktion und das Modul aus der fuzzywuzzy-Bibliothek.

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

Jetzt werden wir die Funktion extractOne() aus dem process verwenden, um zu zeigen, wie es funktioniert, und es wird nur die wahrscheinlichste gefundene Übereinstimmung zurückgeben. Wir wollen also zum Beispiel Beautiful Bldgfs abgleichen und dann anhand des Spaltennamens mit df1 vergleichen.

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

Wie wir sehen können, gibt es Beautiful Buildings Inc. zurück, und 77 ist eine Schätzung oder Zuversicht, dass dies die richtige Übereinstimmung ist. Und im letzten Zahlenwert zeigt 2 an, welche Position es im Datenrahmen hat.

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

Um den gesamten Datenrahmen für alle Spalten zu vergleichen, würden wir eine neue Spalte erstellen, die Spalte Company_Name aus df1 laden und sie mit der Funktion map() zuordnen. Mit der lambda-Funktion rufen wir extractOne() auf.

Innerhalb dieser Funktion setzen wir df2 und überprüfen die Spalte, um die beste Übereinstimmung zu finden, und danach könnten wir Indizes verwenden, da sie ein Tupel zurückgeben, und wir nur den ersten Eintrag des Tupels zurückgeben möchten.

Nachdem wir df1 aufgerufen haben, sehen wir, dass wir die besten Übereinstimmungen für alle Einträge erhalten haben.

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

Ausgang:

Pandas Fuzzy-Match - Ausgabe

Hier ist der vollständige Python-Code für das obige Beispiel.

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