2016-12-03 23 views
0

我有一个包含两列200k行的数据集:1 - 唯一的客户ID和地址组合,以及2 - 收入。该表按收入排序,目标是通过与自身进行模糊匹配来清理第1列,以检查是否有足够接近的客户地址组合以及更高的收入,这些组合可以用于替换收入较低的组合来自拼写差异。使用python模糊匹配排序列与自己

实施例:

Output

在上述例子中的第三行是非常类似于第一行,所以我希望它采取的第一行的值。

我有一个工作Python代码,但实在是太慢了:

import pandas as pd 
import datetime 
import time 
import numpy as np 
from pyxdameraulevenshtein import normalized_damerau_levenshtein_distance, normalized_damerau_levenshtein_distance_ndarray 

data = pd.read_csv("CustomerMaster.csv", encoding="ISO-8859-1") 

# Create lookup column from the dataframe itself: 
lookup_data=data['UNIQUE_ID'] 
lookup_data=pd.Series.to_frame(lookup_data) 

# Start iterating on row by row on lookup data to find the first closest fuzzy match and write that back into dataframe: 
    start = time.time() 
    for index,row in data.iterrows(): 
     if index%5000==0:print(index, time.time()-start) 
     for index2, row2 in lookup_data.iterrows(): 
      ratio_val=normalized_damerau_levenshtein_distance(row['UNIQUE_ID'],row2['UNIQUE_ID']) 
      if ratio_val<0.15: 
       data.set_value(index,'UPDATED_ID',row2['UNIQUE_ID']) 
       data.set_value(index,'Ratio_Val',ratio_val) 
       break 

目前这个代码模糊匹配块花费的时间太长运行 - 首15K行约8小时的时间成倍增加为人们会期待。任何有关如何更有效地编写此代码的建议?

回答

1

一个即时建议:由于匹配是对称的,因此您需要将每一行匹配到尚未匹配的行。重写内部循环以跳过先前访问的行。例如,补充一点:

if index2 <= index: 
    continue 

仅此一项将加快以2

因素的匹配