Нечеткое сопоставление двух столбцов в одном и том же информационном кадре с использованием Python
У меня есть два набора данных в одном фрейме данных, каждый из которых показывает список компаний. Один набор данных с 2017 года, а другой с этого года. Я пытаюсь сопоставить два набора данных компании друг с другом, и нечеткое сопоставление ( FuzzyWuzzy) было лучшим способом сделать это. Используя частичное соотношение, я хочу просто иметь столбцы со значениями, перечисленными следующим образом: название компании в прошлом году, самый высокий коэффициент нечеткого соответствия, компания этого года, связанная с этим самым высоким баллом. Исходному фрейму данных была присвоена переменная "data" с названиями компаний в прошлом году в столбце "Company" и названиями компаний в этом году в столбце "Company name". Чтобы выполнить эту задачу, я попытался создать функцию с процессом нечеткого сопоставления extractOne, а затем применить эту функцию к каждому значению / строке в кадре данных. Затем я бы добавил результаты в исходный фрейм данных.
Вот код ниже:
names_array=[]
ratio_array=[]
def match_names(last_year,this_year):
for row in last_year:
x=process.extractOne(row,this_year)
names_array.append(x[0])
ratio_array.append(x[1])
return names_array,ratio_array
#last year company names dataset
last_year=data['Company'].dropna().values
#this year companydataset
this_year=data['Company name'].values
name_match,ratio_match=match_names(last_year,this_year)
data['this_year']=pd.Series(name_match)
data['match_rating']=pd.Series(ratio_match)
data.to_csv("test.csv")
Однако каждый раз, когда я выполняю эту часть кода, два добавленных столбца, которые я создал, не отображаются в csv. Фактически, "test.csv" - это тот же фрейм данных, что и раньше, несмотря на то, что компьютер показывает его как недавно созданный. Если бы кто-то мог указать на проблему или помочь мне каким-либо образом, это было бы действительно ценно.
Изменить (предварительный просмотр фрейма данных):
Company Company name
0 BODYPHLO SPORTIQUE NaN
1 JOSEPH A PERRY NaN
2 PCH RESORT TENNIS SHOP NaN
3 GREYSTONE GOLF CLUB INC. NaN
4 MUSGROVE COUNTRY CLUB NaN
5 CITY OF PELHAM RACQUET CLUB NaN
6 NORTHRIVER YACHT CLUB NaN
7 LAKE FOREST NaN
8 TNL TENNIS PRO SHOP NaN
9 SOUTHERN ATHLETIC CLUB NaN
10 ORANGE BEACH TENNIS CENTER NaN
Затем после окончания записей Компании (наборы данных компании за прошлый год) столбец "Название компании" (наборы данных компании за этот год) начинается следующим образом:
4168 NaN LEWIS TENNIS
4169 NaN CHUCKS PRO SHOP AT
4170 NaN CHUCK KINYON
4171 NaN LAKE COUNTRY RACQUET CLUB
4172 NaN SPORTS ACADEMY & RAC CLUB
1 ответ
Структура вашего фрейма данных странная, учитывая, что один столбец начинается только один раз за другим, однако мы можем заставить его работать. Давайте возьмем следующий пример data
что вы поставили:
Company Company name
0 BODYPHLO SPORTIQUE NaN
1 JOSEPH A PERRY NaN
2 PCH RESORT TENNIS SHOP NaN
3 GREYSTONE GOLF CLUB INC. NaN
4 MUSGROVE COUNTRY CLUB NaN
5 CITY OF PELHAM RACQUET CLUB NaN
6 NORTHRIVER YACHT CLUB NaN
7 LAKE FOREST NaN
8 TNL TENNIS PRO SHOP NaN
9 SOUTHERN ATHLETIC CLUB NaN
10 ORANGE BEACH TENNIS CENTER NaN
11 NaN LEWIS TENNIS
12 NaN CHUCKS PRO SHOP AT
13 NaN CHUCK KINYON
14 NaN LAKE COUNTRY RACQUET CLUB
15 NaN SPORTS ACADEMY & RAC CLUB
Затем выполните сопоставление:
import pandas as pd
from fuzzywuzzy import process, fuzz
known_list = data['Company name'].dropna()
def find_match(x):
match = process.extractOne(x['Company'], known_list, scorer=fuzz.partial_token_sort_ratio)
return pd.Series([match[0], match[1]])
data[['this year','match_rating']] = data.dropna(subset=['Company']).apply(find_match, axis=1, result_type='expand')
Урожайность:
Company Company name this year \
0 BODYPHLO SPORTIQUE NaN SPORTS ACADEMY & RAC CLUB
1 JOSEPH A PERRY NaN CHUCKS PRO SHOP AT
2 PCH RESORT TENNIS SHOP NaN LEWIS TENNIS
3 GREYSTONE GOLF CLUB INC. NaN LAKE COUNTRY RACQUET CLUB
4 MUSGROVE COUNTRY CLUB NaN LAKE COUNTRY RACQUET CLUB
5 CITY OF PELHAM RACQUET CLUB NaN LAKE COUNTRY RACQUET CLUB
6 NORTHRIVER YACHT CLUB NaN LAKE COUNTRY RACQUET CLUB
7 LAKE FOREST NaN LAKE COUNTRY RACQUET CLUB
8 TNL TENNIS PRO SHOP NaN LEWIS TENNIS
9 SOUTHERN ATHLETIC CLUB NaN SPORTS ACADEMY & RAC CLUB
10 ORANGE BEACH TENNIS CENTER NaN LEWIS TENNIS
match_rating
0 47.0
1 43.0
2 67.0
3 43.0
4 67.0
5 72.0
6 48.0
7 64.0
8 67.0
9 50.0
10 67.0