2017-05-11 80 views
0

我有兩個DataFrame對象,每個對象包含2列字符串數據。我需要比較列abcd,然後根據最高匹配率合併兩個DataFrame對象。Python Pandas - SequenceMatch列中每個值和返回收藏夾匹配

DF1        DF2 
a  b       c  d 
apple paster      doser ankle 
bac bur       are  bun 
sit sign      and  lake 
car bun       ape  mason 
alli makeup      noodle paster 

示例輸出

  RESULT        
a  b  c  d  comparison_ratio 
apple paster noodle paster 1 
bac bur  are  bun  0.95 
sit sign and  lake  random number based on match 
car bun  are  bun  1 
alli makeup noodle paster random number based on match 

顯然比是絕配由預留1

我可以遍歷每個DataFrame對象的每一行,並應用difflib.SequenceMatcher函數返回比率,然後將最大比率與相應的數據一起設置爲該線上的值,但考慮到數據量有多大,這將花費很長時間。我很好奇,如果我能以某種方式使用apply跨越兩個DataFrame對象

回答

0

(做了一些原來df2和示例輸出之間的輸出變化?我假設的例子中輸出具有正確的df2應用此功能。 )它看起來像是按行排列acbd,所以首先,讓我們將數據幀連接在一起。

import pandas as pd 
from difflib import SequenceMatcher 

df1 = pd.DataFrame({'a': ['apple', 'bac', 'sit', 'car', 'alli'], 
        'b': ['paster', 'bur', 'sign', 'bun', 'makeup']}) 

df2 = pd.DataFrame({'c': ['noodle', 'are', 'and', 'ape', 'noodle'], 
        'd': ['paster', 'bun', 'lake', 'bun', 'paster']}) 

df = pd.concat([df1, df2], axis=1) 

我們必須做一個apply需要兩列。我們應該創建一個可以將兩個列名作爲參數的函數。

def sim_metric(df, col1, col2): 
    return SequenceMatcher(None, df[col1], df[col2]).ratio() 

我不得不查看SequenceMatcher的工作原理。需要注意的一點是它可以用在數組中,所以你必須小心:你特別感興趣的是字符串順序匹配,元素到元素 - 這就是爲什麼你需要apply並且不能直接插入列。

現在,您可以將此sim_metricacbd

df['a_c_comp'] = df.apply(sim_metric, 
          args=('a', 'c'), 
          axis=1) 

df['b_d_comp'] = df.apply(sim_metric, 
          args=('b', 'd'), 
          axis=1) 

注意我是如何使用的args arg的apply爲通用sim_metric指定列名。

最後,我們可以爲最後的comparison_ratio列做max列。

df['comparison_ratio'] = df[['a_c_comp', 'b_d_comp']].max(axis=1) 
print(df) 

結果如下。

 a  b  c  d a_c_comp b_d_comp comparison_ratio 
0 apple paster noodle paster 0.363636 1.000000   1.000000 
1 bac  bur  are  bun 0.333333 0.666667   0.666667 
2 sit sign  and lake 0.000000 0.000000   0.000000 
3 car  bun  ape  bun 0.333333 1.000000   1.000000 
4 alli makeup noodle paster 0.200000 0.333333   0.333333 
+0

這似乎只是數據幀列之間的一項檢查,我需要對列c和列d中的所有項目檢查列索引1,然後查找最大匹配率並將c和d中的最大匹配比率值連接到該行。這就是爲什麼結果df改變的結果df –

+1

@AranFreel啊,好吧......儘管如此,仍然不完全確定所有的比較。作爲一個例子,你可以從'df1'中拿出'apple'和'paster',告訴我你想要的兩兩比較嗎? –

+0

帶貼紙和蘋果的DF1將在DF2中與排貼面貼紙相匹配,因爲DF1中的b是貼紙,DF2中的d是貼紙。索引0列a和b(apple和paster)中的值都將與列c和d中的所有值進行比較。 Apple將與列c和列d中的每個值進行比較。帕斯特也會這樣做。比較所有值後,最大比率匹配將從DF2行取得,並連接到發生比較的DF1(蘋果和貼紙) –