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

Python Pandas:当分组内存在B>30的行时选取整组数据

解决按分组筛选包含满足条件元素的全部数据问题

我来帮你搞定这个Pandas分组筛选的需求~ 你的目标是按A列分组,保留所有存在至少一个B值大于30的分组的全部数据,下面是具体的实现方法和思路:

首先先明确你的原始数据:

A          B
0  2002-01-12  39
1  2002-01-12  17
2  2002-01-12  31
3  2002-01-15  12
4  2002-01-15  25
5  2002-01-15  25
6  2002-01-20  16
7  2002-01-20  40
8  2002-02-20  20

你尝试的代码df.groupby('A').B.ge(30)其实只返回了每个组内单个元素是否满足B>=30的布尔值,但我们需要的是整个分组是否存在至少一个符合条件的元素,所以需要对每个组的结果做聚合判断。

方法一:先筛选符合条件的分组,再过滤原数据

import pandas as pd

# 构造你的原始DataFrame
data = {
    'A': ['2002-01-12', '2002-01-12', '2002-01-12', '2002-01-15', '2002-01-15', '2002-01-15', '2002-01-20', '2002-01-20', '2002-02-20'],
    'B': [39, 17, 31, 12, 25, 25, 16, 40, 20]
}
df = pd.DataFrame(data)

# 1. 找出所有存在B>30的分组(获取对应的A值)
valid_a_values = df.groupby('A')['B'].apply(lambda group: group.gt(30).any())
# 筛选出结果为True的A值
valid_a_values = valid_a_values[valid_a_values].index

# 2. 用这些A值过滤原DataFrame
result = df[df['A'].isin(valid_a_values)]

print(result)

运行后输出:

A   B
0  2002-01-12  39
1  2002-01-12  17
2  2002-01-12  31
6  2002-01-20  16
7  2002-01-20  40

方法二:用transform一步完成筛选(更简洁)

groupby.transform可以把组级的判断结果广播到每一行,直接生成筛选掩码,代码更紧凑:

result = df[df.groupby('A')['B'].transform(lambda group: group.gt(30).any())]

这个方法和方法一的效果完全一致,只是写法更简洁。

补充说明

你的预期输出里包含了2002-02-20的行,但该分组的B值是20,并不满足B>30的条件,所以正常逻辑下这行会被过滤掉。如果是原始数据有误(比如该行的B值实际大于30),只需要调整判断条件即可,比如把gt(30)改成ge(20)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:55:57