首页 > 解决方案 > 比较 df 中每个合同的日期与该公司跨类别的每个合同

问题描述

我有兴趣看到所有日期 < 60 天的合同适用于同一供应商,但属于不同类别。

我的数据集结构如下所示(简化):

ContractID, Date, Company, Category

我采取的第一步是按公司和日期对 df 进行排序。

现在我只想保留每家公司的合同,这些合同相隔不到 60 天,而另一份合同属于不同类别,但属于同一家公司。因此,如果与同一家公司的合同相隔 10 天,但它属于同一类别,则不应显示。

因此,在按公司分组后,对该组中每一行的每项检查都应该是:是否与同一家公司签订了另一份相隔不到 60 天的合同?如果是,这个其他合同是否属于不同的类别?如果是,请将其保存在 df 中,否则请丢弃。

指出我在 pandas 中的正确功能来做到这一点已经很有帮助。

例子:

Contract 1, 01.01.2018, Company A, Category A
Contract 2,  01.02.2018, Company A, Category A
Contract 3,  10.06.2018, Company A, Category B
Contract 4,  16.07.2018, Company A, Category A
Contract 5, 17.07.2018, Company B, Category C

期望的结果 放弃合同 1,因为它只是在 60 天内签订合同 2,并且他们具有相同的类别 出于同样的原因放弃合同 2 保留合同 3,因为它在 60 天内签订合同 4 并且在不同的类别中与合同 4 相同

标签: pythonpython-3.xpandas

解决方案


在没有看到数据的情况下,我怀疑您希望将数据框加入到类别!= 类别的公司中。然后你可以做日期数学来找出相差 < 60 天的实例。

编辑:

这是我提出的一个解决方案,它创建了一个为您返回数据框的函数。

#sample dataframe 
'''
   ContractID       Date  Company  Category
0           1 2019-02-03        1         1
1           2 2019-02-01        1         3
2           3 2019-02-01        2         2
3           4 2018-02-01        2         3
4           5 2019-02-03        3         1
5           6 2019-02-03        3         1
'''

def contract_checker(df):

    # inner join on itself
    check = df.merge(df,how='inner',on='Company')

    # filter based on conditions
    check = check.loc[(abs(check['Date_x'] - check['Date_y']).dt.days < 60) &
                      (check['Category_x'] != check['Category_y']),:]

    # join again to filter output
    check = df.merge(check[['ContractID_x', 'Company']].rename(index=str, columns={"ContractID_x": "ContractID"}),on=['ContractID', 'Company'],how='inner')

    # return correct dataframe
    return check

df = contract_checker(df)

df

'''
output
   ContractID       Date  Company  Category
0           1 2019-02-03        1         1
1           2 2019-02-01        1         3
'''

推荐阅读