2

我正在使用两个 Dataframes 在 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
4

3 回答 3

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

看结果:

在此处输入图像描述

于 2018-11-07T12:52:19.027 回答
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')

原始连接数据帧:

在此处输入图像描述

最终(重复删除):

在此处输入图像描述

于 2018-11-07T11:39:34.993 回答
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在使用 with 时实际上是“SQL 风格”的分组输出groupby

于 2018-11-07T12:47:04.513 回答