pandas如何基于指定条件删除contract与RB组合下的重复数据行
问题原因
- 第一是日期维度不匹配:你当前的
IssueDate是8位整数(格式为YYYYMMDD,比如19940701代表1994年7月1日),但FromDate1和ToDate1是6位浮点数(格式为YYYYMM,比如197703.0代表1977年3月),二者数值维度差了100倍,直接比较必然不会满足条件,所以输出为空。 - 第二是筛选逻辑错误:你加入了
df.duplicated(subset=["contract", "RB"], keep=False)的条件,这个条件的作用是仅保留contract+RB组合重复出现的行,但你的核心需求是按contract+RB分组后每组取符合条件的行,就算某个组合只有一行只要符合条件也该保留,这个额外条件完全多余,甚至会过滤掉正常结果。
正确实现代码
先对齐日期维度再做筛选,最后按唯一标识去重即可:
import numpy as np import pandas as pd from io import StringIO dfs = """ contract RB RateCompany gs IssueDate ValIssueDate ToDate1 FromDate1 84 GA16 77 T G 19940701 19480101.0 197702.0 190001.0 85 GA16 77 T G 19940701 19980101.0 999999.0 197703.0 """ df = pd.read_csv(StringIO(dfs.strip()), sep='\s+', dtype={"RB": int} ) # 把IssueDate转为YYYYMM格式的数值,和FromDate1、ToDate1维度对齐 df['issue_ym'] = df['IssueDate'] // 100 # 筛选符合日期区间的行,再按contract+RB去重每组保留1行 df = df[df['issue_ym'].between(df['FromDate1'], df['ToDate1'])] \ .drop_duplicates(subset=['contract', 'RB'], keep='first') \ .drop(columns='issue_ym') print(df)
输出结果
contract RB RateCompany gs IssueDate ValIssueDate ToDate1 FromDate1 85 GA16 77 T G 19940701 19980101.0 999999.0 197703.0
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

