2016-10-27 118 views
1

我有以下2數據幀:比較兩組結果

DF1: 
    DATE   ID_1 ID_2 RESULT 
0 2014-06-16  1 a RED 
1 2014-07-01  1 a WHITE 
2 2014-08-16  2 c BLUE 
3 2015-08-16  3 a RED 


DF2 
    DATE   ID_1 ID_2 RESULT 
0 2014-06-16  1 z WHITE 
1 2014-07-01  1 z WHITE 
2 2014-08-16  2 h BLUE 
3 2014-08-16  3 k RED 

,您可以通過運行此獲得:

df1 = pd.DataFrame(columns=["DATE","ID_1", "ID_2", "RESULT" ]) 
df2 = pd.DataFrame(columns=["DATE","ID_1", "ID_2","RESULT"]) 

df1["DATE"] = ['2014-06-16', '2014-07-01', '2014-08-16', '2015-08-16'] 
df1['ID_1'] = [1,1,2,3] 
df1['ID_2'] = ['a', 'a', 'c', 'a'] 
df1['RESULT'] = ['RED', 'WHITE', 'BLUE', 'RED'] 

df2["DATE"] = ['2014-06-16', '2014-07-01', '2014-08-16' , '2014-08-16'] 
df2['ID_1'] = [1,1,2,3] 
df2['ID_2'] = ['z', 'z', 'h', 'k'] 
df2['RESULT'] = ['WHITE', 'WHITE', 'BLUE', 'RED'] 

現在,我需要GROUPBY「ID_1」上都和比較,如果所有列(ID_2除外)是相等的。理想的情況是通過展示不同

結果應該是這樣的:

DATE   ID_1 ID_2x ID2y RESULTx RESULTy 
2014-06-16  1 z  a  WHITE RED 

我試圖通過如下分組:

grp1 = df1.groupby("ID_1") 
grp2 = df2.groupby("ID_1") 

for (g1,g2) in zip(grp1,grp2): 
     g1[1][["DATE", "RESULT"]] != g2[1][["DATE", "RESULT"]] 

但我認爲是沒有效率的。此外,我收到一個比較錯誤:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() 

有關如何繼續的任何想法?

謝謝!

+0

「df1」和「df2」沒有共同的「ID_2」值。除非它們具有唯一的'ID_2'值的完全相同的列表,否則通過壓縮組來迭代是一個壞主意。即使如此,比較這些羣體將會很棘手,因爲它們可能具有不同的長度。 – IanS

+0

當你說「結果應該是」時,你的意思是下面的代碼顯示了預期結果的一行還是整個預期的結果?這並不完全清楚你想要比較的結果是什麼。輸出中應包含給定行的條件是什麼? – ASGM

+0

你說錯了,只是修正了。我的意思是按ID_1分組。 – user2320577

回答

1

重新陳述問題:您想要比較兩個數據框並查找其值不同的所有行(除特定列外)。下面是做這件事的一種方法:

cols = ['DATE', 'ID_1', 'RESULT'] 
cond = (df1[cols] != df2[cols]).any(axis=1) 
new_df = df1[cond].merge(df2[cond], on='ID_1', how='outer', suffixes=('x','y')) 

(結果相差一點點從一個在你的答案,因爲我不能完全確定你要找的一般行爲 - 見答案我的意見) 。