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?

Add a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *