Fuzzy matching uitvoeren in panda's (met voorbeeld)
Vaak wil je misschien twee datasets samenvoegen in panda’s op basis van niet perfect overeenkomende tekenreeksen. Dit wordt fuzzy-matching genoemd.
De eenvoudigste manier om fuzzy matching uit te voeren in panda’s is door de functie get_close_matches() uit het difflib- pakket te gebruiken.
Het volgende voorbeeld laat zien hoe u deze functie in de praktijk kunt gebruiken.
Voorbeeld: vage correspondentie bij panda’s
Laten we zeggen dat we de volgende twee panda-dataframes hebben die informatie bevatten over verschillende basketbalteams:
import pandas as pd
#create two DataFrames
df1 = pd. DataFrame ({' team ': ['Mavericks', 'Nets', 'Warriors', 'Heat', 'Lakers'],
' points ': [99, 90, 104, 117, 100]})
df2 = pd. DataFrame ({' team ': ['Mavricks', 'Warrors', 'Heat', 'Netts', 'Lakes'],
' assists ': [22, 29, 17, 40, 32]})
#view DataFrames
print (df1)
team points
0 Mavericks 99
1 Nets 90
2 Warriors 104
3 Heat 117
4 Lakers 100
print (df2)
team assists
0 Mavricks 22
1 Warriors 29
2 Heat 17
3 Netts 40
4 Lakes 32
Laten we nu zeggen dat we de twee DataFrames willen samenvoegen op basis van de kolom Team .
Omdat de teamnamen enigszins verschillen tussen de twee DataFrames, moeten we fuzzy matching gebruiken om de teamnamen te vinden die het meest overeenkomen.
We kunnen hiervoor de functie get_close_matches() uit het difflib- pakket gebruiken:
import difflib
#create duplicate column to retain team name from df2
df2[' team_match '] = df2[' team ']
#convert team name in df2 to team name it most closely matches in df1
df2[' team '] = df2[' team ']. apply (lambda x: difflib. get_close_matches (x, df1[' team '])[ 0 ])
#merge the DataFrames into one
df3 = df1. merge (df2)
#view final DataFrame
print (df3)
team points assists team_match
0 Mavericks 99 22 Mavricks
1 Nets 90 40 Nets
2 Warriors 104 29 Warriors
3 Heat 117 17 Heat
4 Lakers 100 32 Lakes
Het resultaat is een dataframe dat elk van de vijf teamnamen uit het eerste DataFrame bevat, evenals het team dat het meest overeenkomt met het tweede DataFrame.
In de kolom team_match wordt de teamnaam uit het tweede DataFrame weergegeven die het meest overeenkomt met de teamnaam uit het eerste DataFrame.
Opmerking #1 : Get_close_matches() retourneert standaard de drie dichtstbijzijnde overeenkomsten. Door echter de [0] aan het einde van de lambda-functie te gebruiken, konden we alleen de dichtstbijzijnde teamnaam retourneren.
Opmerking #2: Je kunt hier de volledige documentatie voor de get_close_matches() functie vinden.
Aanvullende bronnen
In de volgende tutorials wordt uitgelegd hoe u andere veelvoorkomende taken in panda’s kunt uitvoeren:
Hoe Pandas DataFrames over meerdere kolommen samen te voegen
Hoe twee Pandas DataFrames op index samen te voegen
Panda’s sluiten zich aan of voegen zich samen: wat is het verschil?