Как выполнить нечеткое сопоставление в pandas (с примером)


Часто вам может потребоваться объединить два набора данных в pandas на основе несовершенно совпадающих строк. Это называется нечетким соответствием .

Самый простой способ выполнить нечеткое сопоставление в pandas — использовать функцию get_close_matches() из пакета difflib .

В следующем примере показано, как использовать эту функцию на практике.

Пример: нечеткая переписка в пандах

Допустим, у нас есть следующие два кадра данных панды, которые содержат информацию о различных баскетбольных командах:

 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

Теперь предположим, что мы хотим объединить два DataFrame на основе столбца «Команда» .

Поскольку названия команд в двух DataFrame немного различаются, нам нужно использовать нечеткое сопоставление, чтобы найти названия команд, которые совпадают больше всего.

Для этого мы можем использовать функцию get_close_matches() из пакета difflib :

 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

Результатом является кадр данных, содержащий каждое из пяти названий команд из первого DataFrame, а также команду, которая наиболее точно соответствует второму DataFrame.

Столбец team_match отображает название команды из второго DataFrame, которое наиболее точно соответствует названию команды из первого DataFrame.

Примечание № 1. По умолчанию get_close_matches() возвращает три ближайших совпадения. Однако, используя [0] в конце лямбда-функции, мы смогли вернуть только ближайшее совпадение названия команды.

Примечание №2: Полную документацию по функции get_close_matches() можно найти здесь .

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные задачи в pandas:

Как объединить фреймы данных Pandas по нескольким столбцам
Как объединить два фрейма данных Pandas в индексе
Панды присоединяются или объединяются: в чем разница?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *