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


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

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

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

Пример: нечеткое сопоставление в Pandas

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

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 Warrors 29
2 Heat 17
3 Netts 40
4 Lakes 32

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

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

Для этого мы можем использовать функцию 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 Netts
2 Warriors 104 29 Warrors
3 Heat 117 17 Heat
4 Lakers 100 32 Lakes

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

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

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

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

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

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

Как объединить Pandas DataFrames в несколько столбцов
Как объединить два кадра данных Pandas в индексе
Pandas Join и Merge: в чем разница?

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.