Python 3.x 2个系列/df.columns之间的模糊查找

Python 3.x 2个系列/df.columns之间的模糊查找,python-3.x,pandas,fuzzywuzzy,Python 3.x,Pandas,Fuzzywuzzy,基于此链接,我尝试进行模糊查找:在2个dfs之间: import pandas as pd df1 = pd.DataFrame(data={'Brand_var':['Johnny Walker','Guiness','Smirnoff','Vat 69','Tanqueray']}) df2 = pd.DataFrame(data={'Product':['J.Walker Blue Label 12 CC','J.Morgan Blue Walker','Giness blue 150 C

基于此链接,我尝试进行模糊查找:在2个dfs之间:

import pandas as pd
df1 = pd.DataFrame(data={'Brand_var':['Johnny Walker','Guiness','Smirnoff','Vat 69','Tanqueray']})
df2 = pd.DataFrame(data={'Product':['J.Walker Blue Label 12 CC','J.Morgan Blue Walker','Giness blue 150 CC','tqry qiuyur qtre','v69 g nesscom ui123']})
我有两个DF df1和df2,需要通过模糊查找/任何其他适合的方法进行映射

下面是我正在使用的代码:

from fuzzywuzzy import fuzz
from fuzzywuzzy import process
compare = pd.MultiIndex.from_product([df1['Brand_var'],
                                      df2['Product']]).to_series()
def metrics(tup):
    return pd.Series([fuzz.ratio(*tup),
                      fuzz.token_sort_ratio(*tup)],
                     ['ratio', 'token'])
compare.apply(metrics)
df = compare.apply(metrics).unstack().idxmax().unstack(0)
print(df)
以下是我的输出:

                             ratio       token
----------------------------------------------------------
Giness blue 150 CC         Guiness      Guiness
J.Morgan Blue Walker       Johnny Walker Johnny Walker 
J.Walker Blue Label 12 CC  Johnny Walker Johnny Walker 
tqry qiuyur qtre           Tanqueray     Tanqueray
v69 g nesscom ui123        Guiness       Guiness
预期产出:

                             ratio       token
----------------------------------------------------------
Giness blue 150 CC          Guiness       Guiness
J.Morgan Blue Walker        None          None
J.Walker Blue Label 12 CC   Johnny Walker Johnny Walker 
tqry qiuyur qtre            Tanqueray     Tanqueray
v69 g nesscom ui123         Vat 69        Vat 69
import pandas as pd
from fuzzywuzzy import fuzz
df1 = pd.DataFrame(data={'Brand_var':['Johnny Walker','Guiness','Smirnoff','Vat 69','Tanqueray']})
df2 = pd.DataFrame(data={'Product':['J.Walker Blue Label 12 CC','J.Morgan Blue Walker','Giness blue 150 CC','tqry qiuyur qtre','v69 g nesscom ui123']})

Guiness_Beer = ["Giness","Guiness","Gines"]
Johnny_Walker = ["J.Walker","J.walker"]
Tanqueray     =["tqry","Tanqueray","tquery"]
Vat = ["69","Vat69","Vat 69"]

matched_names = []

for row in df1.index:
    brand_name = df2.get_value(row,"Product")
    Rule_Guiness = any(word in brand_name for word in Guiness_Beer)
    Rule_Johnny_Walker = any(word in brand_name for word in Johnny_Walker)
    Rule_Tanqueray = any(word in brand_name for word in Tanqueray)
    Rule_Vat = any(word in brand_name for word in Vat)
    if Rule_Guiness:
        matched_names.append([brand_name,"Guiness"])
    elif Rule_Johnny_Walker:
        matched_names.append([brand_name,"Johnny Walker"])
    elif Rule_Tanqueray:
        matched_names.append([brand_name,"Tanqueray"])
    elif Rule_Vat:
        matched_names.append([brand_name,"Vat 69"])
    else:
        matched_names.append([brand_name,"None"])


df = pd.DataFrame(columns=['Product', 'Brand'], data=matched_names)
有什么更好的方法(不使用fuzzy wuzzy也可以)来获得我想要的输出吗


提前谢谢。:)

以下带有规则的代码将为您提供预期的输出:

                             ratio       token
----------------------------------------------------------
Giness blue 150 CC          Guiness       Guiness
J.Morgan Blue Walker        None          None
J.Walker Blue Label 12 CC   Johnny Walker Johnny Walker 
tqry qiuyur qtre            Tanqueray     Tanqueray
v69 g nesscom ui123         Vat 69        Vat 69
import pandas as pd
from fuzzywuzzy import fuzz
df1 = pd.DataFrame(data={'Brand_var':['Johnny Walker','Guiness','Smirnoff','Vat 69','Tanqueray']})
df2 = pd.DataFrame(data={'Product':['J.Walker Blue Label 12 CC','J.Morgan Blue Walker','Giness blue 150 CC','tqry qiuyur qtre','v69 g nesscom ui123']})

Guiness_Beer = ["Giness","Guiness","Gines"]
Johnny_Walker = ["J.Walker","J.walker"]
Tanqueray     =["tqry","Tanqueray","tquery"]
Vat = ["69","Vat69","Vat 69"]

matched_names = []

for row in df1.index:
    brand_name = df2.get_value(row,"Product")
    Rule_Guiness = any(word in brand_name for word in Guiness_Beer)
    Rule_Johnny_Walker = any(word in brand_name for word in Johnny_Walker)
    Rule_Tanqueray = any(word in brand_name for word in Tanqueray)
    Rule_Vat = any(word in brand_name for word in Vat)
    if Rule_Guiness:
        matched_names.append([brand_name,"Guiness"])
    elif Rule_Johnny_Walker:
        matched_names.append([brand_name,"Johnny Walker"])
    elif Rule_Tanqueray:
        matched_names.append([brand_name,"Tanqueray"])
    elif Rule_Vat:
        matched_names.append([brand_name,"Vat 69"])
    else:
        matched_names.append([brand_name,"None"])


df = pd.DataFrame(columns=['Product', 'Brand'], data=matched_names)

你可以在这方面做更多的修改,就像所有的字典一样,比如吉尼斯啤酒等等。你可以通过excel进行配置,并且如果将来你想添加/减去/修改任何关键词,你不必触摸代码。

所以问题是为什么
模糊模糊
不能像需要的那样工作?@jezrael:不,我想知道是否有更好的方法通过fuzzywuzzy或pandas获得所需的输出…?:)嗯,熊猫没有实现类似的方法,可能需要不同的库,比如
fuzzywuzzy
。我没有这方面的经验,但我希望得到一些答案。但是你也可以解释为什么有
None
s?因为
fuzzyfuzzy
总是返回一些值,所以永远不会得到它(但可能我错了)。不幸的是,我在这方面没有经验,所以没有答案,也没有解决方案:(比如,如果产品包含“Giness”或“Gines”或“Guiness”等词,那么品牌变量就是“Guiness”。第二条规则:如果产品包含“69”,那么品牌就是“增值税69"等等。你必须根据你的数据建立它们谢谢,但是如果我不想硬编码任何特定的品牌呢?我的意思是我不能附加所有的名称,因为有1000个,这基本上取决于你的规则!!你想如何对它们进行聚类?你也可以对品牌进行聚类,存储它们,并将它们作为你正在传递的产品进行传递s