在 Python 中自动比较 Winmerge

Mih*_*han 6 python compare numpy dataframe differentiation

我需要一个助手在 python 中对两个表之间的比较进行编码,目前在 winmerge 中完成。

代码如下

import pandas as pd
Run Code Online (Sandbox Code Playgroud)

上周的表

df1=pd.read_csv(r"C:\Users\ri0a\OneDrive - Department of Environment, Land, Water and Planning\Python practice\pvmodules+_210326.csv")
Run Code Online (Sandbox Code Playgroud)

带有新型号和到期日期的本周表

df2=pd.read_csv(r"C:\Users\ri0a\OneDrive - Department of Environment, Land, Water and Planning\Python practice\pvmodules+_210401.csv")
Run Code Online (Sandbox Code Playgroud)

表头如下

在此处输入图片说明

第三列是 PV_module 证书:到期日期。我想设置一个类似于 excel 逻辑 '=IF (D2<DATEVALUE("19/04/2021"),"Expired","OK 的逻辑。这里的目标是删除到期日期低于的整个行特定日期/今天的日期。

接下来,导入dataframe_diff包

from dataframe_diff import dataframe_diff
Run Code Online (Sandbox Code Playgroud)

执行差异

d1_column,d2_additional=dataframe_diff(df1,df2,key=['PV Module Certificate: Licensee/Certificate Holder Account','Model Number/s'])
Run Code Online (Sandbox Code Playgroud)

使用此包 d2_additional 显示与上周相比,本周是否添加了与型号相关的新行。 在此处输入图片说明

但是,我正在尝试复制以下输出

在此处输入图片说明

涉及的任务是

  1. 如果某个模型(在本例中为一行)包含在上周的表中,但在当前周的表中缺失,我想在它旁边的新列“状态”中分配一个新字段“过期”。/或创建一个新的数据框 d2_expires,仅来自那些丢失的行。
  2. 另一个数据框,其中上周丢失但本周添加的行或产品模型仍然......作为 d2_additional。
  3. 第三个数据帧,其中相同行(相同证书 + 相同型号但不同的新到期日期)的任何更改(例如到期日期)被捕获为 d3_comparison。

请帮助我解决这个问题。

提前致谢。

现在:与

d2_expires = merged_df[merged_df._merge == 'left_only']
Run Code Online (Sandbox Code Playgroud)

d2_additional = merged_df[merged_df._merge == 'right_only']
Run Code Online (Sandbox Code Playgroud)

我得到相同的输出。返回相同的行,这不应该是这种情况。如下图所示

过期输出

这与添加相同 d2_aDDITIONS 与 D2_EXPIRES 的输出相同

最后,我收到 d2_comaprison 的错误。

d3_comparison = merged_df[merged_df._merge == 'both'].\
        loc[lambda x: x.PV Module Certificate: Expiry Date_last_week != x.PV Module Certificate: Expiry Date_this_week]
Run Code Online (Sandbox Code Playgroud)

错误

我很高兴与您分享我的数据。请发送电子邮件至 rsmnsu@gmail.com 以进行数据共享。

Bet*_*eux 5

您必须确保在加载数据后将日期转换为日期时间格式,并将列重命名为更易于使用的名称(例如“cert_holder”、“model_no”、“approval_date”、“expiry_date”)

我想设置一个类似于 excel 逻辑 '=IF (D2<DATEVALUE("19/04/2021"),"Expired","OK 的逻辑。这里的目标是删除到期日期低于的整个行特定日期/今天的日期。

这(删除)可以通过以下方式完成:

df = df[df['expiry_date'] >= pd.Timestamp('today')]

# Or

df = df[df['expiry_date'] >= pd.Timestamp('2021-04-23')]
Run Code Online (Sandbox Code Playgroud)

但这仅适用于您的到期日期为日期时间格式的情况。

接下来合并两个数据框:

merged_df = pd.merge(df1,df2, how='outer', on=['cert_holder','model_no'],\
                     suffixes=['_last_week','_this_week'], indicator=True)
Run Code Online (Sandbox Code Playgroud)

如果某个模型(在本例中为一行)包含在上周的表中,但在当前周的表中缺失,我想在它旁边的新列“状态”中分配一个新字段“过期”。/或创建一个新的数据框 d2_expires,仅来自那些丢失的行。

d2_expires = merged_df[merged_df._merge == 'left_only']
Run Code Online (Sandbox Code Playgroud)

另一个数据框,其中上周丢失但本周添加的行或产品模型仍然......作为 d2_additional。

d2_additional = merged_df[merged_df._merge == 'right_only']
Run Code Online (Sandbox Code Playgroud)

第三个数据帧,其中相同行(相同证书 + 相同型号但不同的新到期日期)的任何更改(例如到期日期)被捕获为 d3_comparison。

d3_comparison = merged_df[merged_df._merge == 'both'].\
        loc[lambda x: x.expiry_date_last_week != x.expiry_date_this_week]
Run Code Online (Sandbox Code Playgroud)

  • `df['column'] = pd.to_datetime(df['column'])`。如果它无法正确识别 d/m/y,则必须使用 df['column'] = pd.to_datetime(df['column'], format='%d/%m/%Y') 进行扩展` (2认同)