在数据框中的同一列内对模糊匹配进行分组

问题描述 投票:0回答:1

我试图对相似的公司名称进行分组,基于模糊匹配(在同一列内)。 但是它们既没有正确分组,也没有在结果数据集中有相同数量的行。由于一对多匹配,行数比原始数据多。

  • **代码**
df.loc[:,'Account Name Copy'] = df['Account Name']

compare = pd.MultiIndex.from_product([df['Account Name'],
                                      df['Account Name Copy']]).to_series()

def metrics(tup):
    return pd.Series([fuzz.ratio(*tup),
                      fuzz.token_sort_ratio(*tup)],
                     ['ratio', 'token'])

compare.apply(metrics)

电流输出

附言最终输出中的行数应与原始数据中的行数相同,并将相似的公司名称分组。

期望的输出

参考以下主题,但没有得到想要的输出

https://stackoverflow.com/questions/54865890/fuzzy-match-strings-in-one-column-and-create-new-dataframe-using-fuzzywuzzy

https://stackoverflow.com/questions/71427827/fuzzy-matching-and-grouping

https://stackoverflow.com/questions/60987641/check-if-there-is-a-similar-string-in-the-same-column

https://stackoverflow.com/questions/62085777/fuzzy-match-within-the-same-column-python

请帮忙!!

python python-3.x python-3.7 fuzzywuzzy fuzzy-comparison
1个回答
0
投票

这是一个天真的方法

partial_ratio
可能?)导致您的预期输出。

from itertools import product
from fuzzywuzzy import fuzz

df = pd.read_excel("file.xlsx")

RATIO = 80 # <-- adjust the ratio here

tups = list(product(df["Account Name"].unique(),
                    df["Account Name"].str.split(r"[-\s]").str[0].unique()))

matches = [(pair[1].title(), pair[0]) for pair in tuples_list
           if fuzz.partial_ratio(pair[1].lower(), pair[0].lower()) >= RATIO]
    
out = pd.DataFrame(index=pd.MultiIndex.from_tuples(set(matches),
                   names=["Grouped", "Account Name"])).sort_index()

输出:

© www.soinside.com 2019 - 2024. All rights reserved.