python - 比较 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 相同
解决方案
在没有看到数据的情况下,我怀疑您希望将数据框加入到类别!= 类别的公司中。然后你可以做日期数学来找出相差 < 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
'''
推荐阅读
- vba - Windows Media Player 时间位置
- html - 如何修复导致我的网站格式中断的 iframe 图像?
- bash - 需要在 bash 脚本中创建文件
- java - 无法掌握如何使用 System.arraycopy();
- django - AttributeError: 'NoneType' 对象没有属性 'split' - 在 ajax 调用中保存用户时出错
- javascript - 将 this.size 函数更改为单独的宽度和长度?
- sql - 添加结合 IN 运算符“操作数类型冲突:DATE 与 INT 不兼容”的 CASE 语句时出错
- node.js - 如何从数组中只获取某些值?
- python-3.x - 从中央目录运行用户定义的模块
- typeorm - TypeORM 更新特定列时,保存不影响UpdateDateColumn