如何在两个数据帧之间找到更新的行

2024-05-16 00:06:28 发布

您现在位置:Python中文网/ 问答频道 /正文

  • 我有一个两个数据来源。一个是旧数据,另一个是同一数据的当前版本
  • 我需要在这两个数据中找到newupdated以及deleted
  • 下面是一个例子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
  • 这适用于特定情况。但是,当我将同样的东西应用到我的原始数据帧时(shape(97000,58)和两个列组合在一起形成一个PK),并没有得到期望的结果。它给出了未更新的行
  • 我的问题是‘这是实现这一目标的正确方法吗?’
  • 我该如何改进

Tags: 数据importiddataframeasnpnantmp
1条回答
网友
1楼 · 发布于 2024-05-16 00:06:28

获取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

相关问题 更多 >