将df中每个合同的日期与该公司在各个类别中的每个合同的日期进行比较

时间:2019-04-17 14:38:42

标签: python python-3.x pandas

我很想看到所有日期少于60天的合同都适用于同一供应商,但类别不同。

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

ContractID, Date, Company, Category

我第一步是按公司和日期对df排序。

现在,我只想保留每个不超过60天的公司的合同,以及另一个属于不同类别但同一公司的合同。因此,如果与同一家公司的合同间隔10天,但合同属于同一类别,则不应显示该合同。

因此,按公司分组后,该组中每一行的每张支票应为:与该公司的另一份合同间隔60天以下?如果是,该其他合同是否属于其他类别?如果是,请将其保留在df中,否则丢弃。

为我指出熊猫内部的正确功能已经很有帮助。

示例:

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一样

1 个答案:

答案 0 :(得分:1)

如果没有看到数据,我怀疑您想将数据框加入到类别!=类别的公司中。然后,您可以进行日期数学运算以查找相差少于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
'''