2016-10-27 115 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')) 

(结果相差一点点从一个在你的答案,因为我不能完全确定你要找的一般行为 - 见答案我的意见) 。