2016-04-05 17 views
1

Ben yaklaşık dize eşleştirme yapmak istediğiniz iki veri çerçeve var.yaklaşık bir dize eşleşmesi durumunda bir eşleşme durumunda R

> df1  
Source  Name         Country 
A   Glen fiddich      United Kingdom 
A   Talisker dark storm     United Kingdom 
B   johnney walker      United states 
D   veuve clicquot brut     France 
E   nicolas feuillatte brut    France 
C   glen morangie      united kingdom 
B   Talisker 54 degrees     United kingdom 
F   Talisker dark storm     United states 

ikinci veri çerçevesi

> df2 
Source    Name      Country 
    A   smirnoff ice      Russia 
    A   Talisker daek strome    United Kingdom 
    B   johnney walker      United states 
    D   veuve clicquot brut     Australia 
    E   nicolea feuilate brut    Italy 
    C   glen morangie      united kingdom 
    B   Talisker 54 degrees     United kingdom 

iki veri çerçevesinden arasındaki yaklaşık eşleştirme için anahtar sütun "Ad" dir. Gözlemler için sütunlardaki ilişki nedeniyle, "ülke" sütununda da eşleşme olan yaklaşık eşleşmeleri seçmek önemlidir. Ben kullanıyorum kod özü aşağıdaki gibidir:

dist.mat <- stringdistmatrix(tolower(df1$title), tolower(df2$title), method = "jw", 
      nthread = getOption("sd_num_thread")) 

min.dist <- apply(dist.mat, 1, min) 

matched <- data.frame(df1$title, 
      as.character(apply(dist.mat, 1, function(x) df2$title[which(x == min(x))])), 
      apply(dist.mat, 1, which.min), "jw", apply(dist.mat, 1, min)) 

colnames(matched) <- c("to_be_matched", "closest_match", "index_closest_match", 
        "distance_method", "distance") 

Yukarıdaki kod sadece "Ad" sütununda verilere dayalı df1 ve df2 arasındaki yaklaşık eşleşmeyi yürütür. Yapmak istediğim, "Değer" sütununda, iki değer için "Ülke" sütununda bir eşleşme olması koşuluyla seçilen yaklaşık eşleşme olmalıdır.

cevap

0

Mükemmel bulanık metin eşleme yeteneklerine sahip fuzzywuzzy library ürününü incelemelisiniz. Sonra benzersiz ülkeleri yineleme ve aşağıdaki gibi belli hav eşik puanı geçmek eşleşmeleri görünecektir: Sen eşleşir bulacağınız yerdir almak için scorer girişi çimdik

from fuzzywuzzy import fuzz, process 
matches = [] 
for country in df1['Country'].unique().tolist(): 
    dfm1 = df1[df1['Country'] == country] 
    dfm2 = df2[df2['Country'] == country] 
    candidates = dfm2['Name'].tolist() 
    matches.append(dfm1['Name'].apply(lambda x: x, process.extractOne(x, candidates, score_cutoff=90))) 

.

+0

Sadece başlığa göre bakılırsa, OP bir R tabanlı bir çözüm arıyordu düşünüyorum. –

+0

Aslında düşündüğüm bir python etiketi vardı - benim hatam. –

İlgili konular