如何在两个熊猫数据框之间查找更新的行

时间:2019-10-23 17:58:43

标签: python pandas dataframe join

  • 我有两个数据源。一种数据是旧数据,另一种是同一数据的当前版本。
  • 我需要在这两个数据中找到newupdateddeleted行。
  • 这里是一个例子。 Updated在某种意义上说是从旧数据中更改了任何列的值。
>>> import pandas as pd
>>> import numpy as np
>>> df1 = pd.DataFrame({'id':[1,2,3,4],'b':[4,np.nan,6,12]})
>>> df2 = pd.DataFrame({'id':[2,1,3,5],'b':[np.nan,40,6,6]})
>>> df1
   id     b
0   1   4.0
1   2   NaN
2   3   6.0
3   4  12.0
>>> df2
   id    b
0   2  NaN
1   1  40.0
2   3  6.0
3   5  6.0
  • 此处的id是表的主键。
  • 我可以通过比较主键轻松找到新行。
>>> df2[~df2.id.isin(df1.id)]
   id    b
3   5  6.0
  • 但是我无法在新数据源中找到更新的行。
  • 我尝试关注
>>>tmp = df1.merge(df2)
>>> df2[(~df2.id.isin(tmp.id)) & (df2.id.isin(df1.id))]
   id     b
1   1  40.0
  • 这适用于给定的情况。但是,当我将相同的内容应用于原始数据框-(形状(97000,58)并合并两列构成一个PK)时,效果并不理想。其给出的行未更新。
  • 我的问题是“这是实现此目标的正确方法吗?”。
  • 我该如何改善呢?

1 个答案:

答案 0 :(得分:1)

获取ID的交集,然后使用==进行比较。这是唯一可能的,因为您具有标记相同的数据帧(即,由于相交而具有相同的索引-且具有相同的列)。

ids = set(df1.id.unique()).intersection(df2.id)

d1 = df1[df1.id.isin(ids)].set_index('id').sort_index()
d2 = df2[df2.id.isin(ids)].set_index('id').sort_index()

comp = (d1 == d2) | (pd.isnull(d1) & pd.isnull(d2))

给出一个布尔数据帧,无论值相等,该布尔数据帧的值均为True,而值不同的地方则为False

   id      b
0   1  False
1   2   True
2   3   True