Como realizar correspondência difusa em pandas (com exemplo)
Freqüentemente, você pode querer unir dois conjuntos de dados em pandas com base em strings que correspondem de forma imperfeita. Isso é chamado de correspondência difusa .
A maneira mais fácil de realizar correspondência difusa em pandas é usar a função get_close_matches() do pacote difflib .
O exemplo a seguir mostra como usar esta função na prática.
Exemplo: correspondência difusa em pandas
Digamos que temos os dois DataFrames panda a seguir que contêm informações sobre vários times de basquete:
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
Agora digamos que queremos mesclar os dois DataFrames com base na coluna Equipe .
Como os nomes das equipes são ligeiramente diferentes entre os dois DataFrames, precisamos usar a correspondência difusa para encontrar os nomes das equipes que mais correspondem.
Podemos usar a função get_close_matches() do pacote difflib para fazer isso:
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
O resultado é um quadro de dados contendo cada um dos cinco nomes de equipe do primeiro DataFrame, bem como a equipe que mais se aproxima do segundo DataFrame.
A coluna team_match exibe o nome da equipe do segundo DataFrame que mais se aproxima do nome da equipe do primeiro DataFrame.
Nota nº 1 : por padrão, get_close_matches() retorna as três correspondências mais próximas. No entanto, usando [0] no final da função lambda, só conseguimos retornar a correspondência de nome de equipe mais próxima.
Nota nº 2: você pode encontrar a documentação completa da função get_close_matches() aqui .
Recursos adicionais
Os tutoriais a seguir explicam como realizar outras tarefas comuns em pandas:
Como mesclar Pandas DataFrames em várias colunas
Como mesclar dois DataFrames Pandas no índice
Pandas Join or Merge: Qual é a diferença?