Самый простой способ получить дельту между двумя DataFrames - PullRequest
0 голосов
/ 07 ноября 2018

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

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

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

UPDATE 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

Ответы [ 3 ]

0 голосов
/ 07 ноября 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

0 голосов
/ 07 ноября 2018

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

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

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

enter image description here

0 голосов
/ 07 ноября 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')

оригинальные объединенные кадры данных:

enter image description here

окончательный вариант (дубликаты удалены):

enter image description here

...