我有两个DataFrames,我想根据列合并.然而,由于交替拼写,不同数量的空格,不存在/存在变音符号,我希望能够合并,只要它们彼此相似即可.
任何相似性算法都可以(soundex,Levenshtein,difflib).
假设一个DataFrame具有以下数据:
df1 = DataFrame([[1],[2],[3],[4],[5]], index=['one','two','three','four','five'], columns=['number'])
number
one 1
two 2
three 3
four 4
five 5
df2 = DataFrame([['a'],['b'],['c'],['d'],['e']], index=['one','too','three','fours','five'], columns=['letter'])
letter
one a
too b
three c
fours d
five e
Run Code Online (Sandbox Code Playgroud)
然后我想得到生成的DataFrame
number letter
one 1 a
two 2 b
three 3 c
four 4 d
five 5 e
Run Code Online (Sandbox Code Playgroud) 我正在尝试模糊匹配两个csv文件,每个文件包含一列相似但不相同的名称.
我的代码到目前为止如下:
import pandas as pd
from pandas import DataFrame
from fuzzywuzzy import process
import csv
save_file = open('fuzzy_match_results.csv', 'w')
writer = csv.writer(save_file, lineterminator = '\n')
def parse_csv(path):
with open(path,'r') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
yield row
if __name__ == "__main__":
## Create lookup dictionary by parsing the products csv
data = {}
for row in parse_csv('names_1.csv'):
data[row[0]] = row[0]
## For each row in the lookup compute the partial ratio
for row in parse_csv("names_2.csv"): …
Run Code Online (Sandbox Code Playgroud) 我目前有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) 我有一个这样的输入表:
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)