Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 应用模糊匹配,并获得ID列以及每个匹配的分数矩阵_Python_Pandas_Fuzzywuzzy - Fatal编程技术网

Python 应用模糊匹配,并获得ID列以及每个匹配的分数矩阵

Python 应用模糊匹配,并获得ID列以及每个匹配的分数矩阵,python,pandas,fuzzywuzzy,Python,Pandas,Fuzzywuzzy,我有两个熊猫数据帧,我想基于其中一列进行模糊匹配。一个约5000行的数据框(参考数据框)包含具有类似ID的名称别名,我想与另一个约1500行的数据框(外部)也匹配ID 因此,对于每一个匹配,我将得到模糊分数,然后决定我想使用哪个分数作为两个数据帧之间的最佳匹配。下面的示例中使用了两个数据帧的子集 import pandas as pd from fuzzywuzzy import fuzz #Reference data frame aka_df = pd.DataFrame({"gr

我有两个熊猫数据帧,我想基于其中一列进行模糊匹配。一个约5000行的数据框(参考数据框)包含具有类似ID的名称别名,我想与另一个约1500行的数据框(外部)也匹配ID

因此,对于每一个匹配,我将得到模糊分数,然后决定我想使用哪个分数作为两个数据帧之间的最佳匹配。下面的示例中使用了两个数据帧的子集

import pandas as pd    
from fuzzywuzzy import fuzz

#Reference data frame
aka_df = pd.DataFrame({"grp_id":['M-00353','M-00353','M-00353','M-00538','M-00538','M-00160','M-00160','M-00160','M-00509','M-00509','M-00509','M-00509'],
    "name": ['Buatan I Mill','Inti Indosawit Subur (PKS Buatan I)','Pt Inti Indosawit Subur Buatan I','Batang Kulim','Musim Mas - Batang Kulim','Hindoli (Sungai Lilin)','Hindoli (Pks Sei Lilin)','PT Hindoli',
'Agrowiratama Sukajadi Sawit Mekar 1','PKS PT. Sukajadi Sawit Mekar','Sukajadi Sawit Mekar','Sukajadi Sawit Mekar 1']})

# External data frame    
ext_df = pd.DataFrame({"uml_id": ['P021','P054','P058','P106'],
"mill_name": ['Pt Inti Indosawit Subur - Buatan I','Pt. Musim Mas - Pks Batang Kulim', 'Cargill - Hindoli', 'Pks Pt. Sukajadi Sawit Mekar']})


compare = pd.MultiIndex.from_product([aka_df['name'],ext_df['mill_name']]).to_series()

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

# Create df
compare_df = compare.apply(metrics)

# Reshaping data frame
merge_df = compare_df.reset_index()
unstack_df = merge_df.groupby(['level_0','level_1'])[ 'ratio'].mean().unstack('level_1')
我对比较两个数据帧的代码的参考源于问题。它确实大致提供了我需要的东西,即:

但是,我需要的匹配矩阵中更关键的列是两个数据帧中的ID,如下所示

我对python还是相当陌生的,我相信这很容易做到,但我非常欣赏这方面的一些指导

您可以在传递给
apply()
的函数中使用
merge()
和字典理解:

收益率:

     grp_id                                 name  P021  P054  P058  P106
0   M-00353                        Buatan I Mill    34    36    27    29
1   M-00353  Inti Indosawit Subur (PKS Buatan I)    91    48    27    32
2   M-00353     Pt Inti Indosawit Subur Buatan I    97    50    29    40
3   M-00538                         Batang Kulim    30    55    28    15
4   M-00538             Musim Mas - Batang Kulim    38    86    34    23
5   M-00160               Hindoli (Sungai Lilin)    36    15    37    33
6   M-00160              Hindoli (Pks Sei Lilin)    32    37    36    32
7   M-00160                           PT Hindoli    36    33    59    26
8   M-00509  Agrowiratama Sukajadi Sawit Mekar 1    35    15    12    70
9   M-00509         PKS PT. Sukajadi Sawit Mekar    39    30    18   100
10  M-00509                 Sukajadi Sawit Mekar    33    19    11    83
11  M-00509               Sukajadi Sawit Mekar 1    36    22    15    80

此外,这里还有一个有用的问题,可以让您深入了解不同的
fuzzyfuzzy
评分算法。

类似的问题可能会对您有所帮助。只是一个简单的问题@rahlf23-您知道为什么当我将其应用到更大的数据集时,会有相当多的值显示为
nan
?我希望得到一个完整的分数范围(0-100),很难说没有看到重现“问题”的样本数据帧。您可以通过在应用函数
get悻matches()
中添加打印语句来解决问题,以了解为什么您获得
nan
值。谢谢@rahl23,这是在
process extract
函数中更改
limit
的问题
     grp_id                                 name  P021  P054  P058  P106
0   M-00353                        Buatan I Mill    34    36    27    29
1   M-00353  Inti Indosawit Subur (PKS Buatan I)    91    48    27    32
2   M-00353     Pt Inti Indosawit Subur Buatan I    97    50    29    40
3   M-00538                         Batang Kulim    30    55    28    15
4   M-00538             Musim Mas - Batang Kulim    38    86    34    23
5   M-00160               Hindoli (Sungai Lilin)    36    15    37    33
6   M-00160              Hindoli (Pks Sei Lilin)    32    37    36    32
7   M-00160                           PT Hindoli    36    33    59    26
8   M-00509  Agrowiratama Sukajadi Sawit Mekar 1    35    15    12    70
9   M-00509         PKS PT. Sukajadi Sawit Mekar    39    30    18   100
10  M-00509                 Sukajadi Sawit Mekar    33    19    11    83
11  M-00509               Sukajadi Sawit Mekar 1    36    22    15    80