2016-10-27 6 views
1

У меня есть следующие 2 dataframe:Сравнить две группы результатов

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», итерация с помощью zip-групп - плохая идея. И даже тогда сравнение групп будет сложным, поскольку они, вероятно, будут иметь разную длину. – 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')) 

(результат немного отличается от того, в вашем ответе, потому что я не был полностью уверен, что общее поведение вы ищете - увидеть мои комментарии к ответу) ,

Смежные вопросы