使用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
相关产品推荐
相关产品推荐

