在两个 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 的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章
如何使用单独的键列表在两个 DataFrame 之间执行连接?
Pyspark DataFrame:查找两个 DataFrame 之间的差异(值和列名)