Подтвердить что ты не робот

Pandas: Diff двух 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

включенный в diff:

Я уже пробовал: Сравнение двух фреймов данных различной длины по строкам и добавления столбцов для каждой строки с равным значением и Вывод разницы в двух фреймах данных Pandas бок о бок - выделение разницы

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

Спасибо

Andy

4b9b3361

Ответ 1

merge 2 dfs, используя метод 'outer' и pass param indicator=True, это скажет вам, существуют ли строки в обоих/только влево/вправо, вы можете затем фильтровать объединенный df после:

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

Ответ 2

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

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

Ответ 3

Попробуйте следующее, если вам нужно только добавить новых покупателей к другому df:

df_delta=df2[df2['Buyer'].apply(lambda x: x not in df1['Buyer'].values)]

Ответ 4

Вы можете найти это как лучшее:

df2[ ~df2.isin(df1)].dropna()

Ответ 5

@EdChum ответ самоочевиден. Но использование not 'both' условие имеет больше смысла, и вам не нужно заботиться о порядке сравнения, и это то, что реальная разница должна быть. Ради ответа на ваш вопрос:

merged = df1.merge(df2, indicator=True, how='outer')
merged.loc = [merged['_merge'] != 'both']