比较df中每个合同的日期和该公司的每个合同的类别

2024-06-17 10:07:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有兴趣查看所有有日期的合同<;同一供应商,但不同类别,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,因为它与合同2仅在60天内,并且它们具有相同的类别 出于同样的原因放弃合同2 保持合同3,因为它在60天内合同4和在一个不同的类别 同合同4


Tags: 数据ltdfdate间隔排序公司类别
1条回答
网友
1楼 · 发布于 2024-06-17 10:07:40

在没有看到数据的情况下,我怀疑您希望将数据帧加入到company where category!=类别。然后你就可以做日期数学来找出有<;相差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
'''

相关问题 更多 >