2017-10-13 58 views
1

我試圖計算模糊比例爲多行2個的數據幀:熊貓:我如何迭代2個不同的數據幀的循環?

DF1:

id name 
1  Ab Cd E 
2  X.Y!Z 
3  fgh I 

DF2:

name_2 
abcde 
xyz 

我想計算所有的值之間的模糊比在df1.name和df2.name_2中:

要做到這一點,我有代碼:

for i in df1['name']: 
    for r in df2['name_2']: 
     print(fuzz.ratio(i,r)) 

但是我希望最終結果也有來自df1的id。這將理想是這樣的:

final_df:

id  name  name_2 score 
1  Ab Cd E  abcde  50 
1  Ab Cd E  xyz  0 
2  X.Y!Z  abcde  0 
2  X.Y!Z  xyz  60 
3  fgh I  abcde  0 
3  fgh I  xyz  0 

感謝您的幫助!

+0

你可以嘗試像這樣:'爲我,郵編在zip(df1 ['名稱'],df2 ['名稱2']):...'這將只適用於你想要的,如果兩個數據框是長度相同,但應該適用於您的示例。 –

+0

謝謝!但是我的第二個數據幀只有2行,而第一個數據幀只有3行。 – Sravee

+0

@ L.MacKenzie另外我還希望第一個數據幀的id。感謝您的幫助! – Sravee

回答

1

我不完全理解pd.apply中的lambda函數的應用,但經過一番搜索後,我認爲這是一個合理的解決方案。

import pandas as pd 
from fuzzywuzzy import fuzz 

d = [{'id': 1, 'name': 'Ab Cd e'}, {'id': 2, 'name': 'X.Y!Z'}, {'id': 3, 'name': 'fgh I'}] 
df1 = pd.DataFrame(d) 
df2 = pd.DataFrame({'name_2': ['abcde', 'xyz']}) 

這是熊貓的交叉連接;一個TMP DF需要 pandas cross join no columns in common

df1['tmp'] = 1 
df2['tmp'] = 1 

df = pd.merge(df1, df2, on=['tmp']) 
df = df.drop('tmp', axis=1) 

可以.apply功能fuzz.ratio到列在dfPandas: How to use apply function to multiple columns

df['fuzz_ratio'] = df.apply(lambda row: fuzz.ratio(row['name'], row['name_2']), axis = 1) 

df 

我也試過df1設置索引,但導致從交叉連接DF其排除在外。

+0

這按預期工作。感謝您的幫助! – Sravee

1

你能解決你的問題是這樣的:

創建一個空的數據框:通過兩個DataFrames

final = pandas.DataFrame({'id': [], 'name': [], 'name_2': [], 'score': []}) 

迭代插入ID,名稱和分數和連接它到最後的數據幀:

for id, name in zip(df1['id'], df1['name']): 
    for name2 in df2['name_2']: 
     tmp = pandas.DateFrame({'id': id, 'name': name, 'name_2': name2, 'score': fuzz.ratio(name, name2)}) 
    final = pandas.concat([final, tmp], ignore_index=True) 

print(final) 

有可能是一種更乾淨,更有效的方法來做到這一點,但我希望這有助於。