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

如何在Pandas中移除满足全组多条件的分组数据

在Pandas中移除满足特定条件的分组

原始数据

首先定义目标DataFrame:

import pandas as pd

df = pd.DataFrame([["A",0,"ret"],["C",2,"rem"],["B",1,"ret"],["A",0,"rem"],["B",0,"rem"],["D",0,"rem"],["C",2,"rem"],["D",0,"rem"],["D",0,"rem"]],columns=["id","val1","val2"])

对应的表格数据:

idval1val2
A0ret
C2rem
B1ret
A0rem
B0rem
D0rem
C2rem
D0rem
D0rem

需求说明

需要移除所有行的val1均为0且val2均为"rem"的id分组(例如示例中的D分组,其所有行都满足val1=0且val2="rem"),保留其余分组的全部行。

解决方案

方法一:使用groupby().filter()

直接通过分组过滤实现,代码简洁直观:

# 过滤掉符合移除条件的分组
df_out = df.groupby('id').filter(lambda x: not ((x['val1'] == 0).all() and (x['val2'] == 'rem').all()))

逻辑说明:

  • groupby('id')按id字段对数据分组
  • filter方法接收一个匿名函数,函数判断当前分组是否不满足"所有行val1=0且val2='rem'"的条件,返回True的分组会被保留

方法二:先标记分组再过滤

如果需要更清晰的中间步骤,可以先计算每个分组的标记,再进行过滤:

# 计算每个id分组是否符合移除条件
group_remove_flag = df.groupby('id').apply(lambda x: (x['val1'] == 0).all() and (x['val2'] == 'rem').all())
# 获取需要保留的id列表
keep_ids = group_remove_flag[~group_remove_flag].index
# 过滤原始DataFrame
df_out = df[df['id'].isin(keep_ids)]

预期输出

处理后的df_out对应的表格数据:

idval1val2
A0ret
C2rem
B1ret
A0rem
B0rem
C2rem

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:53:03