在两个DataFrame之间获取增量的最简单方法

时间:2018-11-07 10:10:57

标签: python dataframe pyspark databricks delta

我正在Microsoft Azure Databricks中使用两个数据框。

我已经有一个包含“我的主数据”的数据框。我每天还会收到带有“所有”记录的完整数据包。但是,在此数据框内的记录可能会发生更改,并且记录也可以删除和添加。

在两个数据帧之间获取此数据增量或变更集的最佳方法,也许是最简单的方法?

更新 我每天都会收到的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 :(得分:0)

一种解决方案是将接收到的日期列'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

答案 1 :(得分:0)

您也可以尝试:

>>> 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实际上是与groupby一起使用时的“ SQL样式”分组输出

答案 2 :(得分:0)

这是合并功能。看看是否适合您。

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