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

使用group_by还是filter从DataFrame筛选数据?

该用groupby还是filter?看你的筛选目标!

哈哈,这得看你具体要筛啥——groupby()和filter()根本是两种不同场景的工具,我结合你给的学生成绩数据集给你唠明白:


场景1:单纯挑符合条件的行(不用分组)

如果你的需求就是直接揪出某些满足条件的记录,比如:

  • 找出所有分数超过20的成绩
  • 找出物理科目分数大于20的学生
    这种情况完全不需要groupby,直接用布尔索引或者query()就够了(pandas自带的filter()其实更适合按列名挑列,比如只保留姓名和分数列)。

给你整个实际代码例子:

# 筛选Score>20的所有行
df[df['Score'] > 20]

# 或者用query写起来更简洁
df.query("Score > 20")

场景2:按学生分组后,筛出符合组内条件的整个学生的成绩

如果你的需求是先把同一个学生的成绩归为一组,再挑出满足组内条件的学生的所有成绩,比如:

  • 找出至少有一门科目分数超过20的学生的全部成绩
  • 找出生物考0分,但其他科目平均分超过15的学生
    这种时候就得把groupby()和分组后的filter()搭配起来用了。

比如筛选“至少有一门分数超20”的学生所有成绩:

# 先按First Name分组,然后筛选组内存在Score>20的组
df.groupby('First Name').filter(lambda x: (x['Score'] > 20).any())

运行后会留下Harry Kane(物理25分)、Tom Hault(物理22、数学24、社科25)、Phil Adams(生物20、物理22)的所有成绩,Ben Capario因为所有科目最高才18分,就被排除啦。


场景3:分组聚合后,筛出聚合结果符合条件的组

如果你的需求是先按学生算出平均分/最高分这类聚合值,再挑出符合聚合条件的学生,比如:

  • 找出平均分超过15的学生
  • 找出最高分不到20的学生
    这种时候用groupby()+filter()最直接:
# 筛选平均分>15的学生所有成绩
df.groupby('First Name').filter(lambda x: x['Score'].mean() > 15)

最后给你划个重点:

  • 只是单一行级筛选?直接用布尔索引/query,不用碰groupby;
  • 需要基于组的条件,把整个组的行都留下来/去掉?就用groupby()+分组filter();
  • groupby()本身不是用来直接筛选的,它的核心是把数据按类别拆分成小群体,再对每个小群体做筛选、聚合这类操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:33:31