2016-10-25 3 views
2

у меня есть две панды dataframes определены как таковые:сравнения двух панд кадров данных

_data_orig = [ 
    [1, "Bob", 3.0], 
    [2, "Sam", 2.0], 
    [3, "Jane", 4.0] 
] 
_columns = ["ID", "Name", "GPA"] 

_data_new = [ 
     [1, "Bob", 3.2], 
     [3, "Jane", 3.9], 
     [4, "John", 1.2], 
     [5, "Lisa", 2.2] 
    ] 
_columns = ["ID", "Name", "GPA"] 

df1 = pd.DataFrame(data=_data_orig, columns=_columns) 
df2 = pd.DataFrame(data=_data_new, columns=_columns) 

Мне нужно найти следующую информацию:

  • Поиск удаляет где df1 является набор исходных данных и df2 является новый набор данных
  • Мне нужно найти изменения строк для существующей записи между ними. Идентификатор примера == 1 следует сравнить ID ID ID = 1, чтобы узнать, изменилось ли значение столбца для каждой строки.
  • Найти любые добавления в df2 verse df1. Пример возврата [4, «Джон», 1,2] и [5, «Лиза», 2,2]

Для работы, чтобы найти изменения в строках, я полагал, что я мог смотреть через df2 и проверить DF1, но это кажется медленным , поэтому я надеюсь найти более быстрое решение там.

Для двух других операций, я действительно не знаю, что делать, потому что, когда я пытаюсь сравнить два dataframes я получаю:

ValueError: Can only compare identically-labeled DataFrame objects

Панды версии: «0.16.1»

Предложения?

+1

вы можете проверить [это отличное решение от @piRSquared] (Http: // StackOverflow. com/a/40229031/5741205) – MaxU

ответ

3

установка

m = df1.merge(df2, on=['ID', 'Name'], how='outer', suffixes=['', '_'], indicator=True) 
m 

enter image description here

добавляет

m.loc[m._merge.eq('right_only')]
или
m.query('_merge == "right_only"')

enter image description here

удаляет

m.loc[m._merge.eq('left_only')]
или
m.query('_merge == "left_only"')

enter image description here


0.16.1 ответ

установка

m = df1.merge(df2, on=['ID', 'Name'], how='outer', suffixes=['', '_']) 
m 

enter image description here

добавляет

m.loc[m.GPA_.notnull() & m.GPA.isnull()] 

enter image description here

удаляет

m.loc[m.GPA_.isnull() & m.GPA.notnull()] 

enter image description here

+0

Индикатор = True, кажется, не является допустимым параметром, это новый? Я использую версию '0.16.1' –

+0

@ josh1234 yes! определенно новый от 0.16.1. Обновляет опцию. Я принесу тебе кое-что, что сработает для тебя. Это простая настройка. – piRSquared

+0

К сожалению, я не могу обновить :(Если вы знаете другой способ, сообщите мне об этом! –

0

делает это:

df1.set_index(['Name','ID'])-df2.set_index(['Name','ID']) 
Out[108]: 
      GPA 
Name ID   
Bob 1 -0.2000 
Jane 3 0.1000 
John 4  nan 
Lisa 5  nan 
Sam 2  nan 

позволит вам на экран, если есть разница между df1 и df2.NaN будет представлять значения, которые не пересекаются

+0

, так что это будет работать для поиска различий GPA, но у меня есть другие столбцы, такие как текст, который мне также необходимо найти. Например, адресные данные и т. Д. Я просто поставил упрощенный пример моего набора данных на форуме. –

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