You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:45:04