Часто вы можете захотеть объединить два набора данных в 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: в чем разница?