Самый простой способ получить дельту между двумя DataFrames

Я работаю в Microsoft Azure Databricks с двумя фреймами данных.

У меня уже есть Dataframe, который содержит мои «Masterdata». Я также ежедневно получаю полный пакет данных со «всеми» записями. Но те, кто находится в этом фрейме данных, могут быть изменены в записях, и записи также могут быть удалены и добавлены.

Каков наилучший и, возможно, самый простой способ получить эту дельту или изменение данных между двумя фреймами данных?

ОБНОВЛЕНИЕ DataFrame 1 -> которое я получаю каждый день

customer  score
MERCEDES  1.1
CHRYSLER  3.0

DataFrame 2 -> мой хозяин

customer score
BMW       1.1
MERCEDES  1.3

Итак, что мне нужно получить:

customer score
BMW       1.1    -> cause was deleted in receiving data
MERCEDES  1.3    -> cause was value changed
CHRYSLER  3.0    -> cause was added new

person STORM    schedule 07.11.2018    source источник
comment
вы пробовали функцию слияния?   -  person MEdwin    schedule 07.11.2018
comment
Спасибо за ваш комментарий, но я не хочу объединять оба фрейма данных, вместо этого я хочу сравнить и извлечь различия.   -  person STORM    schedule 07.11.2018
comment
Хорошо, посмотрите, сможете ли вы собрать несколько примеров фреймов данных, чтобы отразить тип данных, которые вы получаете. это даст нам представление о том, чего вы пытаетесь достичь.   -  person MEdwin    schedule 07.11.2018


Ответы (3)


вот функция слияния. Посмотрите, работает ли это для вас.

import pandas as pd
from datetime import datetime

df1 = pd.DataFrame({'customer':['MERCEDES','CHRYSLER'], 'score':[1.1, 3.0]})
df2 = pd.DataFrame({'customer':['BMW','MERCEDES'], 'score':[1.1, 1.3]})

df = pd.merge(df1, df2, on=['customer'], how='outer',indicator=True)
df

посмотреть результат:

введите описание изображения здесь

person MEdwin    schedule 07.11.2018

Решение состоит в том, чтобы добавить столбец полученной даты «RDate» к каждому фрейму данных. Затем объедините два фрейма данных. используя sort by, вы затем выбираете последнее значение.

import numpy as np
import pandas as pd
from datetime import datetime

df1 = pd.DataFrame({'customer':['MERCEDES','CHRYSLER'], 'score':[1.1, 3.0]})
df2 = pd.DataFrame({'customer':['BMW','MERCEDES'], 'score':[1.1, 1.3]})
df2['RDate']='2018-11-01'
df1['RDate']='2018-11-07'

mdf = pd.concat([df1, df2])
mdfs =mdf.sort_values(by='RDate')
mdfs.drop_duplicates('customer', keep='last')

исходные объединенные фреймы данных:

введите описание изображения здесь

финал (дубликаты выпали):

введите описание изображения здесь

person MEdwin    schedule 07.11.2018
comment
MEdwin спасибо за работу! Но это окончательный результат данных. Что мне нужно, так это действительно получить изменения, добавить и удалить как отдельные фреймы данных, чтобы я мог с ними работать. Это тоже возможно? - person STORM; 07.11.2018
comment
хорошо, я думаю, что вам нужна просто функция слияния. Он сообщит вам, содержится ли оценка как в новом, так и в старом фрейме данных, а right_only означает, что это новая запись. - person MEdwin; 07.11.2018

Вы также можете попробовать:

>>> df1
   customer score
0  MERCEDES   1.1
1  CHRYSLER   3.0

>>> df2
   customer score
0       BMW   1.1
1  MERCEDES   1.3

Объедините df1 и df2 в столбцы ..

>>> df = pd.concat([df1,df2], axis=0)

Теперь вы можете использовать groupby с клиентом в качестве ключа для обновления с помощью метода last(offset), который удобен для подмножества конечных периодов данных временных рядов.

>>> df.groupby(['customer'], as_index=False).last()
   customer score
0       BMW   1.1
1  CHRYSLER   3.0
2  MERCEDES   1.3

as_index=False - это сгруппированный вывод "в стиле SQL" при использовании с groupby

person Karn Kumar    schedule 07.11.2018