在两个 DataFrame 之间获得 delta 的最简单方法

Posted

技术标签:

【中文标题】在两个 DataFrame 之间获得 delta 的最简单方法【英文标题】:Easiest way to get delta between two DataFrames 【发布时间】:2018-11-07 10:10:56 【问题描述】:

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

我已经有一个包含我的“Masterdata”的数据框。我每天还收到一个包含“所有”记录的完整数据包。但是在这个 Dataframe 中的那些可以在记录中进行更改,并且也可以删除和添加记录。

在两个 Dataframes 之间获取这个 delta 或 changeset 数据的最佳且可能是最简单的方法是什么?

更新 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

【问题讨论】:

你试过合并功能吗? 感谢您的评论,但我不想合并两个数据框,而是想比较并提取差异。 好的,看看你能不能把一些示例数据框放在一起来反映你得到的数据类型。它会让我们了解您想要实现的目标。 【参考方案1】:

这里是合并函数。看看它是否适合你。

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

查看结果:

【讨论】:

【参考方案2】:

解决方案是将接收日期列“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')

原始连接数据帧:

最终(重复删除):

【讨论】:

MEdwin 感谢您的工作!但这是数据的最终结果。我需要的是真正获得更改,作为单独的数据框添加和删除,以便我可以使用它。这也可能吗? 好的,我认为您需要的只是合并功能。它会让你知道分数是否包含在新旧数据帧中,而 right_only 表示它是一个新条目。【参考方案3】:

你也可以试试:

>>> 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 风格”的分组输出

【讨论】:

以上是关于在两个 DataFrame 之间获得 delta 的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

Grep:Memory在比较两个文件以查找delta时耗尽

如何使用单独的键列表在两个 DataFrame 之间执行连接?

Pyspark DataFrame:查找两个 DataFrame 之间的差异(值和列名)

Pandas:在两个日期之间选择 DataFrame 行(日期时间索引)

选择两个日期之间的 DataFrame 行

找出具有相同形状的两个DataFrame之间的差异