Come eseguire la corrispondenza fuzzy in panda (con esempio)
Spesso potresti voler unire due set di dati insieme in panda basati su stringhe che corrispondono in modo imperfetto. Questo si chiama corrispondenza fuzzy .
Il modo più semplice per eseguire la corrispondenza fuzzy nei panda è utilizzare la funzione get_close_matches() dal pacchetto difflib .
L’esempio seguente mostra come utilizzare questa funzione nella pratica.
Esempio: corrispondenza fuzzy nei panda
Supponiamo di avere i seguenti due DataFrames panda che contengono informazioni su varie squadre di basket:
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
Ora diciamo che vogliamo unire i due DataFrame in base alla colonna Team .
Poiché i nomi delle squadre sono leggermente diversi tra i due DataFrame, dobbiamo utilizzare la corrispondenza fuzzy per trovare i nomi delle squadre che corrispondono di più.
Possiamo usare la funzione get_close_matches() dal pacchetto difflib per fare questo:
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
Il risultato è un frame di dati contenente ciascuno dei cinque nomi di squadra del primo DataFrame, nonché la squadra che corrisponde maggiormente al secondo DataFrame.
La colonna team_match mostra il nome della squadra del secondo DataFrame che corrisponde maggiormente al nome della squadra del primo DataFrame.
Nota n. 1 : per impostazione predefinita, get_close_matches() restituisce le tre corrispondenze più vicine. Tuttavia, utilizzando [0] alla fine della funzione lambda, siamo riusciti a restituire solo la corrispondenza del nome della squadra più vicina.
Nota n.2: puoi trovare la documentazione completa per la funzione get_close_matches() qui .
Risorse addizionali
I seguenti tutorial spiegano come eseguire altre attività comuni nei panda:
Come unire Pandas DataFrames su più colonne
Come unire due DataFrames Panda su index
Panda si uniscono o si uniscono: qual è la differenza?