标签: fuzzywuzzy

Python Pandas模糊合并/匹配重复

我目前有2个数据帧,1个用于捐赠者,1个用于筹款.理想情况下,我想要找到的是,如果有任何筹款人也捐赠,如果是的话,将一些信息复制到我的募捐人数据集(捐赠者姓名,电子邮件和他们的第一次捐赠).我的数据存在问题1)我需要通过姓名和电子邮件进行匹配,但用户可能会略有不同的名称(来自Kat和Kathy).2)捐赠者和筹款人的名称重复.2a)有了捐赠者,我可以获得独特的名字/电子邮件组合,因为我只关心第一个捐赠日期2b)虽然我需要保留两行而不会丢失数据,如日期.

我现在的示例代码:

import pandas as pd
import datetime
from fuzzywuzzy import fuzz
import difflib 

donors = pd.DataFrame({"name": pd.Series(["John Doe","John Doe","Tom Smith","Jane Doe","Jane Doe","Kat test"]), "Email": pd.Series(['a@a.ca','a@a.ca','b@b.ca','c@c.ca','something@a.ca','d@d.ca']),"Date": (["27/03/2013  10:00:00 AM","1/03/2013  10:39:00 AM","2/03/2013  10:39:00 AM","3/03/2013  10:39:00 AM","4/03/2013  10:39:00 AM","27/03/2013  10:39:00 AM"])})
fundraisers = pd.DataFrame({"name": pd.Series(["John Doe","John Doe","Kathy test","Tes Ester", "Jane Doe"]),"Email": pd.Series(['a@a.ca','a@a.ca','d@d.ca','asdf@asdf.ca','something@a.ca']),"Date": pd.Series(["2/03/2013  10:39:00 AM","27/03/2013  11:39:00 AM","3/03/2013  10:39:00 AM","4/03/2013  10:40:00 AM","27/03/2013  10:39:00 AM"])})
donors["Date"] = pd.to_datetime(donors["Date"], dayfirst=True)
fundraisers["Date"] = pd.to_datetime(donors["Date"], dayfirst=True)
donors["code"] = donors.apply(lambda row: str(row['name'])+' '+str(row['Email']), axis=1)
idx = donors.groupby('code')["Date"].transform(min) == …
Run Code Online (Sandbox Code Playgroud)

python fuzzy-search pandas fuzzywuzzy

5
推荐指数
1
解决办法
6531
查看次数

使用fuzzywuzzy在dataframe中创建新列

我有一个数据框pandas,我fuzzywuzzy在python中使用package来匹配数据框中的第一列和第二列.

我已经定义了一个函数来创建具有第一列,第二列和部分比率得分的输出.但它没有用.

能否请你帮忙

import csv
import sys
import os
import numpy as np
import pandas as pd
from fuzzywuzzy import fuzz
from fuzzywuzzy import process

def match(driver):
    driver["score"]=driver.apply(lambda row: fuzz.partial_ratio(row driver[driver.columns[0]], driver[driver.columns[1]]), axis=1)
    print(driver)
    return(driver)
Run Code Online (Sandbox Code Playgroud)

问候

-算盘

python pandas fuzzywuzzy

5
推荐指数
1
解决办法
2337
查看次数

Dask:非常低的CPU使用率和多线程?这是预期的吗?

我使用的dask是在如何使用适用于熊猫并行多(模糊)的字符串比较?

基本上我做一些计算(没有写任何东西到磁盘)调用PandasFuzzywuzzy(可能不会释放GIL显然,如果这有帮助),我运行如下:

dmaster = dd.from_pandas(master, npartitions=4)
dmaster = dmaster.assign(my_value=dmaster.original.apply(lambda x: helper(x, slave), name='my_value'))
dmaster.compute(get=dask.multiprocessing.get)
Run Code Online (Sandbox Code Playgroud)

但是,代码的变体现在已经运行了10个小时,并且还没有结束.我在Windows任务管理器中注意到了

  • RAM utilization 非常低,对应于我的数据大小
  • CPU usage 每2/3秒左右从0%反弹至最高5%
  • 20 Python processes的大小是100MB,一个Python进程可能包含30GB大小的数据(我有一个128 GB的机器和8核CPU)

问题是:预期的行为是什么?我在dask这里设置一些选项显然是非常错误的吗?

当然,我明白细节取决于我到底在做什么,但也许上面模式已经可以说出某些事情是非常错误的?

非常感谢!!

python multithreading pandas fuzzywuzzy dask

5
推荐指数
1
解决办法
1330
查看次数

使用Python的jellyfish模块获得最佳匹配(部分字符串匹配)

我正在尝试创建某种字典来附加我的结果并使用 jaro 距离函数获得最佳匹配。

这是我尝试匹配两个列表并在两个列表中获得最佳匹配名称的一部分。

例子:

import jellyfish
jellyfish.jaro_distance(u'jellyfish', u'sellyfish')

output: 
0.9259259259259259
Run Code Online (Sandbox Code Playgroud)

我想做的是:

listA = ['grellofish','mellofush','jellyfihs','sellyfish','salmonfish']
listB = ['jellyfish','salmonfish']

#convert to unicode
listA = [unicode(i) for i in listA]
listB = [unicode(i) for i in listB]

for nickB in listB:
    for nickA in listA:
        results = jellyfish.jaro_distance(nickA, nickB)
        print nickB,nickA,results

output:
jellyfish grellofish 0.825925925926
jellyfish mellofush 0.777777777778
jellyfish jellyfihs 0.962962962963
jellyfish sellyfish 0.925925925926
jellyfish salmonfish 0.685185185185
salmonfish grellofish 0.733333333333
salmonfish mellofush 0.7
salmonfish jellyfihs 0.618518518519
salmonfish sellyfish 0.755555555556
salmonfish salmonfish 1.0 …
Run Code Online (Sandbox Code Playgroud)

python string-matching fuzzywuzzy

5
推荐指数
1
解决办法
6246
查看次数

基于条件python的2大数据集模糊Wuzzy字符串匹配

我有2个大数据集,我已经读入Pandas DataFrames(分别为~20K行和~40K行).当我尝试在地址字段上使用pandas.merge直接合并这两个DF时,与行数相比,我获得了微不足道的匹配数.所以我想我会尝试模糊字符串匹配,看它是否改善了输出匹配的数量.

我试图在DF1(20K行)中创建一个新列,这是将DF1 [地址线]上的fuzzywuzzy extractone函数应用于DF2 [addressline]的结果.我很快意识到这将需要永远,因为它将进行近10亿次比较.

这两个数据集都有"县"字段,我的问题是:有没有办法根据"县"字段是否有条件地在两个DF中的"地址线"字段上进行模糊字符串匹配?研究类似于我的问题我偶然发现了这个问题:使用Python对大数据集进行模糊逻辑

然而,我仍然模糊(没有双关语)如何进行基于县的分组/阻止字段.任何建议将不胜感激!

import pandas as pd
from fuzzywuzzy import process

def fuzzy_match(x, choices, scorer, cutoff):
  return process.extractOne(x, choices = choices, scorer = scorer, score_cutoff= cutoff)[0]

test = pd.DataFrame({'Address1':['123 Cheese Way','234 Cookie Place','345 Pizza Drive','456 Pretzel Junction'],'ID':['X','U','X','Y']}) 
test2 = pd.DataFrame({'Address1':['123 chese wy','234 kookie Pl','345 Pizzza DR','456 Pretzel Junktion'],'ID':['X','U','X','Y']}) 
test['Address1'] = test['Address1'].apply(lambda x: x.lower()) 
test2['Address1'] = test2['Address1'].apply(lambda x: x.lower()) 
test['FuzzyAddress1'] = test['Address1'].apply(fuzzy_match, args = (test2['Address1'], fuzz.ratio, 80))
Run Code Online (Sandbox Code Playgroud)

我添加了2张图像,这些图像是导入Excel的2个不同DF的样本集.并非所有字段都包含在内,因为它们对我的问题并不重要.为了重申我的最终目标,我希望在其中一个DF中有一个新列,其中最重要的结果是模糊匹配地址线和第二个DF中的其他地址线,但仅适用于两个DF之间匹配的那些行.从那里我计划合并两个dfs,一个在模糊匹配地址和第二个DF中的地址行列.希望这听起来并不令人困惑.

python large-data fuzzy-comparison pandas fuzzywuzzy

5
推荐指数
1
解决办法
7817
查看次数

多个值的字符串比较python

我有几组数据。第一个(A)是具有复杂名称的设备列表。第二个是更广泛的设备类别(B)的列表-我必须将第一个列表归类为使用字符串比较。我知道这并不完美。

对于列表A中的每个实体-我想为列表B中的每个实体建立levenshtein距离。列表B中得分最高的记录将是我将其分配给该数据点的组。

我在python中非常生锈-并且正在使用FuzzyWuzzy来获取两个字符串值之间的距离。但是-我不太清楚如何遍历每个列表以生成所需的内容。

我想我只是为每个数据集创建一个列表,并为每个数据集编写一个非常基本的循环-但是就像我说的那样,我有点生疏,没有运气。

任何帮助将不胜感激!如果还有其他软件包可以使我做到这一点(而不是Fuzzy)-我很乐意提出建议。

python levenshtein-distance fuzzywuzzy

5
推荐指数
1
解决办法
511
查看次数

R中的模糊匹配

我试图检测一个打开的文本字段(读:凌乱!)与名称向量之间的匹配.我创造了一个愚蠢的水果例子,突出了我的主要挑战.

df1 <- data.frame(id = c(1, 2, 3, 4, 5, 6),
              entry = c("Apple", 
                        "I love apples", 
                        "appls",
                        "Bannanas",
                        "banana", 
                        "An apple a day keeps..."))
df1$entry <- as.character(df1$entry)

df2 <- data.frame(fruit=c("apple",
                          "banana",
                          "pineapple"),
                  code=c(11, 12, 13))
df2$fruit <- as.character(df2$fruit)

df1 %>%
  mutate(match = str_detect(str_to_lower(entry), 
                            str_to_lower(df2$fruit)))
Run Code Online (Sandbox Code Playgroud)

如果你愿意的话,我的方法会抓住低悬的水果(完全匹配"Apple"和"banana").

#  id                   entry match
#1  1                   Apple  TRUE
#2  2           I love apples FALSE
#3  3                   appls FALSE
#4  4                Bannanas FALSE
#5  5                  banana  TRUE
#6  6 An apple a day keeps... FALSE …
Run Code Online (Sandbox Code Playgroud)

r fuzzywuzzy

5
推荐指数
1
解决办法
1776
查看次数

Python 将数据集中的相似记录(字符串)分组

我有一个这样的输入表:

In [182]: data_set
Out[182]: 
       name             ID
0  stackoverflow       123      
1  stikoverflow        322      
2  stack, overflow     411      
3  internet.com        531      
4  internet            112      
5  football            001
Run Code Online (Sandbox Code Playgroud)

我想根据模糊模糊对类似的字符串进行分组。因此,在应用模糊匹配后,所有超过某个相似度阈值(如 > %90 相似度)的字符串将组合在一起。所以期望的输出是:

In [182]: output
Out[182]: 
       name             ID     group
0  stackoverflow       123       1
1  stikoverflow        322       1
2  stack, overflow     411       1
3  internet.com        531       2
4  internet            112       2
5  football            001       3
Run Code Online (Sandbox Code Playgroud)

我正在搜索不同的主题,我发现这个这个只是名称匹配而不是聚类。此外,这个只显示了最佳匹配,它对我没有帮助。这个页面也解释了k-means聚类需要预先设置聚类的数量,这在这种情况下是不切实际的。

更新:

我发现包中的process方法可以在fuzzywuzzy某种程度上解决我的问题。但是此方法仅将字符串与列表进行比较,而不是将列表与列表进行比较:

from fuzzywuzzy import …
Run Code Online (Sandbox Code Playgroud)

python cluster-analysis string-matching pandas fuzzywuzzy

5
推荐指数
1
解决办法
1736
查看次数

AttributeError:模块“fuzzywuzzy”没有属性“ratio”

我试图从 fuzzywuzzy 库中调用ratio()函数来匹配两个字符串并收到以下错误消息:

AttributeError: module 'fuzzywuzzy' has no attribute 'ratio'
Run Code Online (Sandbox Code Playgroud)

版本有变化吗?我试图在 fuzz 中寻找其他函数来查看它是否存在,但我无法找到它。

import fuzzywuzzy as fuzz
from fuzzywuzzy import process
import Levenshtein
fuzz.ratio('Lord of the Rings', 'The Lord of the Rings')
Run Code Online (Sandbox Code Playgroud)

python fuzzywuzzy

4
推荐指数
1
解决办法
6466
查看次数

在Python中进行字符串匹配时,有没有办法提高匹配性能?

我有一本非常大的字典,里面存储了大量的英语句子及其西班牙语翻译。当给定一个随机英语句子时,我打算使用 Python 的 fuzzywuzzy 库在字典中找到它最接近的匹配项。我的代码:

\n
from fuzzywuzzy import process\nsentencePairs = {'How are you?':'\xc2\xbfC\xc3\xb3mo est\xc3\xa1s?', 'Good morning!':'\xc2\xa1Buenos d\xc3\xadas!'}\nquery= 'How old are you?'\nmatch = process.extractOne(query, sentencePairs.keys())[0]\nprint(match, sentencePairs[match], sep='\\n')\n
Run Code Online (Sandbox Code Playgroud)\n

在现实生活中,sentencePairs字典会非常大,至少存储一百万个项目。因此,即使安装了 python-Levenshtein 来提供加速,使用 fuzzywuzzy 也需要很长时间才能得到结果。\n那么有没有更好的方法来获得更好的性能呢?我的目标是在几秒钟内甚至实时获得结果。

\n

python performance fuzzywuzzy

4
推荐指数
1
解决办法
1191
查看次数