使用Pandas检测两个或多个CSV中的变化

vqlkdk9b  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(114)

我尝试使用Pandas来检测两个CSV之间的更改。我希望它能够突出显示哪些UID发生了更改。我附上了一个理想输出here.的示例
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中,U 02和U 04看到了电子邮件更改,而U 05和U 06则完全是新记录。
我试过使用pandas比较功能,但不幸的是它不起作用,因为CSV 2的记录比CSV 1多。
我已经连接了UID和email字段,就像这样,然后创建了一个名为“Unique”的新字段,以显示连接的值是重复的True还是False(但不显示它是否完全是一个新记录)

df3['Concatenated'] = df3["UID"] +"~"+ df3["Email"]

df3['Unique'] = ~df3['Concatenated'].duplicated(keep=False)

这在一定程度上是可行的,但感觉很笨重,我想知道是否有人有更聪明的方法来做到这一点-特别是当涉及到显示唱片是否是新的或不是。

vwkv1x7d

vwkv1x7d1#

这里的策略是合并UID上的两个 Dataframe ,然后比较email列,最后查看新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

相关问题