我正在尝试使用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