ist es möglich zu tun, fuzzy-match-merge mit python pandas?
Habe ich zwei DataFrames, die ich Zusammenführen möchten, basierend auf einer Spalte. Jedoch, aufgrund von alternativen Schreibweisen, unterschiedliche Anzahl von Leerzeichen, die Abwesenheit/Anwesenheit von diakritischen Zeichen, ich möchte in der Lage sein zu verschmelzen, solange Sie einander ähnlich.
Jedem ähnlichkeits-Algorithmus (soundex, Levenshtein, difflib).
Sagen ein DataFrame hat die folgenden Daten:
df1 = DataFrame([[1],[2],[3],[4],[5]], index=['one','two','three','four','five'], columns=['number'])
number
one 1
two 2
three 3
four 4
five 5
df2 = DataFrame([['a'],['b'],['c'],['d'],['e']], index=['one','too','three','fours','five'], columns=['letter'])
letter
one a
too b
three c
fours d
five e
Dann möchte ich, um die daraus resultierenden DataFrame
number letter
one 1 a
two 2 b
three 3 c
four 4 d
five 5 e
Ich habe gerade fusioniert ein paar hundert DataFrames gestern mit
Vielleicht sollte ich etwas klarer (Bearbeiten Frage jetzt). Ich Zusammenführen möchten, auf ähnliche Werte zwischen den beiden DataFrames
Ja, mit d6tjoin MergeTop1 notebook
.rename
, in der Regel ist dies eine ganz schnelle Lösung (obwohl ich denke, es hängt davon ab, wie viele Rechtschreibfehler vorhanden sind...) - und ich mag, um zu Steuern, welche Spalte die Namen sind wirklich ähnlich.Vielleicht sollte ich etwas klarer (Bearbeiten Frage jetzt). Ich Zusammenführen möchten, auf ähnliche Werte zwischen den beiden DataFrames
Ja, mit d6tjoin MergeTop1 notebook
InformationsquelleAutor pocketfullofcheese | 2012-11-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ähnlich wie @locojay Vorschlag, den Sie anwenden können,
difflib
'sget_close_matches
zudf2
's index und dann einejoin
:.
Wenn diese Spalten wurden, in der gleichen Vene, die Sie anwenden könnten, um die Spalte dann
merge
:Weiß jemand, ob es einen Weg gibt, dies zu tun, zwischen den Zeilen der einen Spalte? Ich bin versucht, Duplikate zu finden, die möglicherweise Tippfehler
Sie können verwenden Sie n=1 beschränken, die Ergebnisse zu 1. docs.python.org/3/library/...
Funktioniert nicht wenn es mehrere Spiele.
Wie gehen Sie vor, wenn die beiden dataframes unterschiedliche Längen haben?
InformationsquelleAutor Andy Hayden
Habe ich geschrieben, ein Python-Paket, welches darauf abzielt, dieses problem zu lösen:
pip install fuzzymatcher
Finden Sie die repo - hier und docs hier.
Grundlegende Verwendung:
Gegeben zwei dataframes
df_left
unddf_right
, die Sie wollen, um fuzzy-Verknüpfung, können Sie die folgenden schreiben:Oder wenn Sie wollen einfach nur auf den link am ähnlichsten ist:
no such module: fts4
InformationsquelleAutor RobinL
Ich würde Jaro-Winkler, denn es ist eines der am meisten robust und präzise Ungefähre string-matching-algorithmen, die derzeit verfügbar [Cohen, et al.], [Winkler].
Dies ist, wie ich es tun würde, mit Jaro-Winkler von der Quallen Paket:
Ausgabe:
Gibt es eine Möglichkeit, um diese Fahrt? Dieser code nicht gut zu skalieren.
InformationsquelleAutor lostsoul29
http://pandas.pydata.org/pandas-docs/dev/merging.html nicht über eine hook-Funktion zu tun, diese on-the-fly. Wäre schön, wenn...
Würde ich nur tun, in einem separaten Schritt, und verwenden Sie difflib getclosest_matches zum erstellen einer neuen Spalte in einer der 2 dataframes und der merge/join auf die fuzzy-abgestimmt Spalte
difflib.get_closest_matches
zu schaffen, wie eine Spalte und dann Zusammenführen?InformationsquelleAutor locojay
Als ein heads-up, das im Grunde funktioniert, außer wenn keine übereinstimmung gefunden wird, oder wenn Sie haben NaNs entweder Spalte. Anstatt direkt anwenden
get_close_matches
fand ich es einfacher in der Anwendung die folgende Funktion. Die Wahl von NaN Ersatz hängt viel von Ihrem dataset.InformationsquelleAutor Luke
Können Sie d6tjoin für das
index number index_right letter
0 one 1 one a
1 two 2 too b
2 three 3 three c
3 four 4 fours d
4 five 5 five e
Es hat eine Vielzahl von zusätzlichen Funktionen wie:
Details siehe
Gerade getestet, es gibt mir seltsame Ergebnisse zurück, beispielsweise die abgestimmten
government
mitbusiness
, gibt es eine Möglichkeit, konfigurieren Sie den Schwellenwert für die matching-Punktzahl?Ja, siehe Referenz-docs, die Sie übergeben können
top_limit
- und vielleicht wollen Sie auch zu ändernfun_diff
zufun_diff=[affinegap.affineGapDistance]
die dazu neigt, zu geben, besser entspricht.InformationsquelleAutor citynorman
Mit
fuzzywuzzy
Da gibt es keine Beispiele mit der
fuzzywuzzy
Paket, hier ist eine Funktion, die ich schrieb, wird wieder alle Spiele basierend auf einem Schwellenwert können Sie festlegen, wie ein Benutzer:Beispiel datframe
- Funktion für das fuzzy-matching -
Mit unserer Funktion auf der dataframes: #1
Mit unserer Funktion auf der dataframes: #2
Installation:
Pip
Anaconda
InformationsquelleAutor Erfan