获取两个 DataFrame 之间的增量的最简单方法
Easiest way to get delta between two DataFrames
我在 Microsoft Azure Databricks 中使用两个 Dataframes。
我已经有一个包含我的 "Masterdata" 的 Dataframe。我每天还会收到一个包含 "all" 条记录的完整数据包。但是在这个 Dataframe 中的那些可以在记录中进行更改,也可以删除和添加记录。
在两个数据帧之间获取此增量或数据变更集的最佳且最简单的方法是什么?
更新
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
一种解决方案是将接收日期列“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')
原始串联数据帧:
最终(删除重复项):
您也可以这样尝试:
>>> 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-style" 分组输出
这里是合并函数。看看它是否适合你。
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
查看结果:
我在 Microsoft Azure Databricks 中使用两个 Dataframes。
我已经有一个包含我的 "Masterdata" 的 Dataframe。我每天还会收到一个包含 "all" 条记录的完整数据包。但是在这个 Dataframe 中的那些可以在记录中进行更改,也可以删除和添加记录。
在两个数据帧之间获取此增量或数据变更集的最佳且最简单的方法是什么?
更新 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
一种解决方案是将接收日期列“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')
原始串联数据帧:
最终(删除重复项):
您也可以这样尝试:
>>> 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
这里是合并函数。看看它是否适合你。
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
查看结果: