2016-10-27 4 views
1

나는 다음과 같은 2 dataframe 있습니다두 그룹이 결과를 비교

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'] 

이 지금은 모두 "ID_1을"GROUPBY 모든 경우 비교해야 : 당신이 이것을 실행하여 취득 할 수있는

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 

을 열 (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')) 

(난 당신이 찾고있는 일반적인 행동에 대해 완전히 확신하지 못했습니다 때문에 결과는 당신의 대답의 하나에서 약간 다릅니다 - 대답에 내 의견을 참조) : 여기에 그 일을 한 가지 방법이다 .