2017-08-09 59 views
0

我在以下兩個dataframes,我需要根據DF1如何根據多列高效地完成查找在數據幀

DF1

col1 col2 col3 value 

Chicago M  26 54 

NY  M  20 21 
... 

DF2

col1 col2 col3 value 

NY  M 20 ? (should be 21 based on above dataframe) 
在DF2計算值列

我在做像下面這樣慢的循環

for index, row in df2.iterrows(): 
    df1[(df1['col1'] == row['col1']) 
        & (df1['col2'] == df1['col2']) 
        &(df1['col3'] == df1['col3'])]['value'].values[0] 

如何更有效/快速地做到這一點?

+0

如果答案的幫助下,你可以[接受最有用的一個(https://stackoverflow.com/help/someone-答案)。 –

回答

0

創建一個映射,然後調用pd.Series.replace

mapping = dict(df1[['col1', 'value']].values) 
df2['value'] = '' 
df2.value = df2.value.replace(mapping) 
0

您需要merge與左邊欄加入了第一次比較:

print (df2) 
    col1 col2 col3 value 
0 LA M 20 20 
1 NY M 20  ? 

df = pd.merge(df2, df1, on=['col1','col2','col3'], how='left', suffixes=('','_')) 

它創建新列value_1與匹配的值。最後使用fillna由初始值和最後刪除輔助列value_更換NaN S:

print (df) 
    col1 col2 col3 value value_ 
0 LA M 20 20  NaN 
1 NY M 20  ? 21.0 

df['value'] = df['value_'].fillna(df['value']) 
df = df.drop('value_', axis=1) 
print (df) 
    col1 col2 col3 value 
0 LA M 20 20 
1 NY M 20 21 
+0

謝謝。我正在研究一個需要使用'>'而不是'=='的情況,並且完全忘記了我可以在這種情況下合併 – user843809

+0

嗯,這是完全不同的問題和更復雜的問題。你能更新數據嗎?而且你使用多列 - 所以如果一列值更高,而下一列2更低 - 那麼輸出是什麼? – jezrael