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

Pandas如何根据关联表计算值删除DataFrame指定条件行

实现方案

你之前用call.drop()加query的写法不好动态适配每个Key的删除数量,换分组标记的思路实现更简单,核心规则是每个Key分组下仅删除指定数量的Status为"A"的行,非"A"状态行全部保留。

完整可运行代码

import pandas as pd

# 构造示例数据表
a =  {'List':['List1','List1','List1','List1','List2','List3','List3','List1','List2','List2', 'List3'], 
      'Status': ['A', 'A', 'DO','A','A', 'A', 'DO','C','A', 'A', 'A'],
      'Key': ['List1 2022-02-09', 'List1 2022-02-09', 'List1 2022-02-09','List1 2022-02-09','List2 2022-02-09', 'List3 2022-02-09', 'List3 2022-02-09','List1 2022-02-10','List2 2022-02-10', 'List2 2022-02-10', 'List3 2022-02-10']}
call = pd.DataFrame(data = a)

b = {'Key': ['List1 2022-02-09', 'List2 2022-02-09', 'List3 2022-02-09','List1 2022-02-10', 'List2 2022-02-10', 'List3 2022-02-10'], 
     '# drop': [2,1,1,0,1,1]}
DimsDrops = pd.DataFrame(data = b)

# 核心处理步骤
# 1. 标记Status为A的行,仅这类行参与删除计算
call['is_A'] = call['Status'].eq('A')
# 2. 关联每个Key对应的需要删除的A行数量
call = call.merge(DimsDrops, on='Key', how='left')
# 3. 按Key分组,给组内每一条A行编从0开始的序号,非A行不参与编号
call['a_row_num'] = call.groupby('Key')['is_A'].cumsum() - call['is_A'].astype(int)
# 4. 筛选保留数据:非A行全部保留,A行仅保留序号大于等于待删除数量的部分
result = call[
    ~call['is_A'] | (call['a_row_num'] >= call['# drop'])
].drop(columns=['is_A', 'a_row_num', '# drop']).reset_index(drop=True)

结果验证

执行print(result)输出的内容和预期完全一致:

List Status               Key
0  List1      A  List1 2022-02-09
1  List1     DO  List1 2022-02-09
2  List3     DO  List3 2022-02-09
3  List1      C  List1 2022-02-10
4  List2      A  List2 2022-02-10

逻辑说明

  • 不需要硬拼复杂的query筛选条件,先关联删除规则、再按分组标记待删除行的方式容错率更高,后续调整删除规则也方便
  • 编号逻辑从0开始计数:比如Key为List1 2022-02-09的分组下共有3条A状态行,编号依次为0、1、2,对应要删除2条,就保留编号>=2的最后1条A行,符合需求
  • 非A状态(DO、C)的行不会被纳入删除计数,会全部保留,不会出现误删
  • 如果需要直接在原call表上修改,把筛选后的结果直接赋值给call即可,记得删除过程中新增的临时辅助列

内容的提问来源于stack exchange,提问作者wysouf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:12:21