2016-11-29 223 views
3

我有一個問題,我找到了一個解決方案,但我覺得這是做錯的方法。 也許,有一個更「規範」的方式來做到這一點。熊貓(Python) - 從條件更新另一個數據框的列

問題

我有兩個數據框,我想,而無需額外的列,但不刪除現有的相關信息進行合併。例如:

現有數據幀(DF)

A A2 B 
0 1 4 0 
1 2 5 1 

數據幀合併(DF2)

A A2 B 
0 1 4 2 
1 3 5 2 

我想與df2更新df如果列 'A' 和 'A2' 對應。 其結果將是(:

A A2 B 
0 1 4 2.0 <= Update value ONLY 
1 2 5 1.0 

這裏是我的解決方案,但我認爲這不是一個非常好的一個

import pandas as pd 

df = pd.DataFrame([[1,4,0],[2,5,1]],columns=['A','A2','B']) 

df2 = pd.DataFrame([[1,4,2],[3,5,2]],columns=['A','A2','B']) 

df = df.merge(df2,on=['A', 'A2'],how='left') 
df['B_y'].fillna(0, inplace=True) 
df['B'] = df['B_x']+df['B_y'] 
df = df.drop(['B_x','B_y'], axis=1) 
print(df) 

有沒有人有一個更好的方式做 感謝

?!

回答

7

是的,它可以在不合並完成:

rows = (df[['A','A2']] == df2[['A','A2']]).all(axis=1) 
df.loc[rows,'B'] = df2.loc[rows,'B'] 
+0

簡單而優雅。謝謝 ! :) – Lerenn

+0

嗨!我有兩個不同的DF(DF1和DF2),我面臨與此相同的問題。我試過這個解決方案,但得到以下錯誤:'ValueError:只能比較標識相同的DataFrame對象。兩個DF的大小都不相同,但重要的列標記相同。爲什麼我得到這個錯誤?我做了這個:'values =(df [[SITE_IP,PORT_NAME]] == dfLags [[SITE_IP,PORT_NAME]])。all(axis = 1)' –

+0

除了列以外,行還有標籤存儲在索引。例如,用'df3 = df.copy(); df3.index = ['G','H']',比較'df [['A','A2']] == df3 [['A','A2']]'產生相同的錯誤。因此,即使具有相同的形狀,也不能進行有效的比較。也許有些廣播技巧可能會有幫助。 – Quickbeam2k1

1

你可以試試這個:

df.ix[df2.loc[(df['A'] == df2['A']) & (df['A2'] == 
df2['A2']),'B'].index.values,'B'] = \ 
df2.loc[(df['A'] == df2['A']) & (df['A2'] == df2['A2']),'B'] 
+0

比Quickbeam2k1的有點長一點,但它做的不錯。謝謝 :) – Lerenn

相關問題