2016-04-27 2 views
20

Мне нужно сравнить два кадра данных разного размера по строке и распечатать несоответствующие строки. Позволяет принимать следующие два:Pandas: Diff of two Dataframes

df1 = DataFrame({ 
'Buyer': ['Carl', 'Carl', 'Carl'], 
'Quantity': [18, 3, 5, ]}) 

df2 = DataFrame({ 
'Buyer': ['Carl', 'Mark', 'Carl', 'Carl'], 
'Quantity': [2, 1, 18, 5]}) 

Что является наиболее эффективным способом строчном над df2 и распечатывать строки не в df1, например:

Buyer  Quantity 
Carl   2 
Mark   1 

Важно: Я не хочу иметь строку :

Buyer  Quantity 
Carl   3 

включены в дифф:

Я уже пробовал: Comparing two dataframes of different length row by row and adding columns for each row with equal value и Outputting difference in two Pandas dataframes side by side - highlighting the difference

Но это не соответствует моей проблеме.

Спасибо

Энди

+0

Почему нет приемлемого ответа? – famargar

ответ

43

merge в 2 ДФС, используя метод «внешнее» и передать параметров indicator=True это скажет вам, присутствуют ли в обе строки/влево только/право, вы можете фильтровать объединенный ДФ после:

In [22]: 
merged = df1.merge(df2, indicator=True, how='outer') 
merged[merged['_merge'] == 'right_only'] 

Out[22]: 
    Buyer Quantity  _merge 
3 Carl   2 right_only 
4 Mark   1 right_only 
+1

выше скрипт помог мне, спасибо – Plinus

+0

df3 = merged.loc [merged ['_ merge'] == 'left_only'] df3 .drop (['_ merge'], axis = 1, inplace = True), дающий предупреждение (от предупреждений модуля): Файл "D: /Work/psnl/python/pyCharm/compare2RSfile.py", линия 1 импорт ОС, SYS, ntpath, строка даты и времени, winsound, время SettingWithCopyWarning: значение пытается быть установленным на копии среза из DataFrame, как преодолеть это предупреждение – Plinus

+0

, даже если оно дает такое же предупреждение, если добавить новое поле, df3 ['Value'] = '' – Plinus

1
diff = set(zip(df2.Buyer, df2.Quantity)) - set(zip(df1.Buyer, df1.Quantity)) 

Это первое решение, которое пришло на ум. Затем вы можете поместить diff в DF для презентации.

+0

Мне это нравится. Но как вы набираете результат diff в новый DF? – eezis

+0

@eezis В этом случае: 'DataFrame (list (diff), columns = ['Buyer', 'Quantity'])'. Имейте в виду, что это не сохраняет индексы исходного DF. – Shovalt