使用Pandas检测两个或多个csv中的更改



我正在尝试使用Pandas来检测两个csv之间的更改。理想情况下,我希望它能突出显示哪些uid已被更改。我在这里附上了一个理想输出的示例。

CSV 1(导入为DataFrame):

| UID      | Email           |
| -------- | --------------- |
| U01      | u01@email.com   |
| U02      | u02@email.com   |
| U03      | u03@email.com   |
| U04      | u04@email.com   |

CSV 2(导入为DataFrame):

| UID      | Email           |
| -------- | --------------- |
| U01      | u01@email.com   |
| U02      | newemail@email.com   |
| U03      | u03@email.com   |
| U04      | newemail2@email.com  |
| U05      | u05@email.com   |
| U06      | u06@email.com   |

在两个csv中,U02和U04的电子邮件发生了变化,而U05和U06则完全是新的记录。

我试过使用pandas比较函数,不幸的是它不起作用,因为CSV2比CSV1有更多的记录。

我将UID和email字段连接起来,就像这样,然后创建一个名为"unique"的新字段。显示连接的值是重复的True还是False(但不显示它是否完全是一个新记录)

df3['Concatenated'] = df3["UID"] +"~"+ df3["Email"]
df3['Unique'] = ~df3['Concatenated'].duplicated(keep=False)

这在一定程度上是有效的,但是感觉很笨拙,我想知道是否有人有更聪明的方法来做到这一点-特别是当它显示记录是否是新的时。

这里的策略是合并UID上的两个数据帧,然后比较电子邮件列,最后查看新的UID是否在UID列表中。

df_compare = pd.merge(left=df, right=df_new, how='outer', on='UID')
df_compare['Change Status'] = df_compare.apply(lambda x: 'No Change' if x.Email_x == x.Email_y else 'Change', axis=1)
df_compare.loc[~df_compare.UID.isin(df.UID),'Change Status'] = 'New Record'
df_compare = df_compare.drop(columns=['Email_x']).rename(columns={'Email_y': 'Email'})

给出df_compare为:

UID                Email Change Status
0  U01        u01@email.com     No Change
1  U02   newemail@email.com        Change
2  U03        u03@email.com     No Change
3  U04  newemail2@email.com        Change
4  U05        u05@email.com    New Record
5  U06        u06@email.com    New Record

相关内容

  • 没有找到相关文章

最新更新