我很想看到所有日期少于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一样
答案 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
'''