如何在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"])
对应的表格数据:
| id | val1 | val2 |
|---|---|---|
| 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 |
需求说明
需要移除所有行的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对应的表格数据:
| id | val1 | val2 |
|---|---|---|
| A | 0 | ret |
| C | 2 | rem |
| B | 1 | ret |
| A | 0 | rem |
| B | 0 | rem |
| C | 2 | rem |
内容的提问来源于stack exchange,提问作者Chethan
相关产品推荐
相关产品推荐

