Нечеткое сопоставление двух столбцов в одном и том же информационном кадре с использованием Python - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть два набора данных в одном и том же фрейме данных, каждый из которых показывает список компаний. Один набор данных с 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 Ответ

0 голосов
/ 01 ноября 2018

Ваша структура данных нечетная, учитывая, что один столбец начинается только один раз, а другой конец, однако мы можем заставить его работать. Давайте возьмем следующий образец данных для 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 
...