2017-02-28 98 views
0

我正在做一些我知道我不該做的事情。我內做一個for循環迴路(聽起來更恐怖,因爲我把它寫下來。)基本上,我想要做的,從理論上說,使用兩個dataframes是這樣的:pandas iterrows()兩個數據框

for index, row in df_2.iterrows(): 
    for index_1, row_1 in df_1.iterrows(): 
     if row['column_1'] == row_1['column_1'] and row['column_2'] == row_1['column_2'] and row['column_3'] == row_1['column_2']: 
      row['column_4'] = row_1['column_4'] 

必須有一種(更好的)方式來做這樣的事情。請幫忙!

+2

您可以在這些列上進行內部連接,然後您將得到一個包含所有所需行的新df。迭代比如果你喜歡。 –

+0

另一個複雜的是我可能需要做一些模糊的字符串匹配(列有錯別字)。在這種情況下,內連接不適合我。 –

回答

0

正如@Andy Hayden在is it possible to do fuzzy match merge with python pandas?中指出的,您可以使用difflibget_closest_matches函數來創建新的連接列。現在

import difflib 
df_2['fuzzy_column_1'] = df_2['column_1'].apply(lambda x: difflib.get_close_matches(x, df_1['column_1'])[0]) 
# Do same for all other columns 

你可以申請內部聯接使用熊貓merge功能。

result_df = df_1.merge(df_2,left_on=['column_1', 'column_2','column_3'], and right_on=['fuzzy_column_1','fuzzy_column_2','fuzzy_column_3]) 

您可以使用drop函數刪除不需要的列。

+0

謝謝!我正在考慮使用'fuzzwuzz'模塊,但這似乎更好。 –

+0

上述代碼是否適合您? –

+0

對不起,遲到的迴應。我認爲它正在工作,但'get_closest_matches'強制選擇,有時這在我的情況下是不合適的。所以我回到使用'fuzzywuzzy'。 –

相關問題