使用pandas和fuzzwuzzy匹配相似的列元素

时间:2018-10-03 18:17:57

标签: python pandas fuzzywuzzy

我有一个excel文件,其中一列包含1000多个公司名称,而另一列包含约20,000个公司名称。

目标是匹配尽可能多的名称。问题是第一列(1000 +)中的名称格式设置不正确,这意味着“公司名称”字符串的外观可能类似于“ 9Com(panynAm9e00” )。我试图找出解决此问题的最佳方法(只有12个名字完全匹配)

在尝试了不同的方法之后,我最终尝试使用正则表达式来匹配每个名称中的4-5个或更多字符,具体取决于每个字符串的长度。但是我只是在努力寻找最有效的方法来做到这一点。

例如:

第1列

 1. 9Com(panynAm9e00 
 2. NikE4 
 3. Mitrosof2

第2列

 1. Microsoft
 2. Company Name
 3. Nike

第1列中获取第一个元素,然后在第2列中查找匹配项。如果不完全匹配,则查找具有4-5个相同字符的字符串。

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

我建议使用pandaspd.read_excel()阅读您的Excel文件,然后使用fuzzywuzzy进行匹配,例如:

import pandas as pd
from fuzzywuzzy import process, fuzz

df = pd.DataFrame([['9Com(panynAm9e00'],
        ['NikE4'],
        ['Mitrosof2']],
        columns=['Name'])

known_list = ['Microsoft','Company Name','Nike']

def find_match(x):

  match = process.extractOne(x, known_list, scorer=fuzz.partial_token_sort_ratio)[0]
  return match

df['match found'] = [find_match(row) for row in df['Name']]

收益:

               Name   match found
0  9Com(panynAm9e00  Company Name
1             NikE4          Nike
2         Mitrosof2     Microsoft

答案 1 :(得分:0)

我猜想数字在实际的公司名称中不是很常见,因此最初的过滤步骤将极大地帮助前进,但是即使没有这种方法,这也是一种可以相对较好地实现的实现。如果您愿意的话,采用“成语袋”(word-of-words)方法。

  1. 将所有内容(col 1和2)都转换为小写
  2. 对于第2列中的每个已知公司,存储每个唯一字母以及它在词典中出现(计数)的次数
  3. 对第1列中的每个条目执行相同的操作(第2步)
  4. 对于第1列中的每个条目,从真实公司名称列表中找到最接近的信函袋(步骤2的词典)

字典距离实现取决于您。