概述
filter()按组级条件筛选分组,保留符合条件的整组数据,返回原行数据(行数不变或减少,但不会折叠)。
filter()
签名
GroupBy.filter(func, dropna=True, *args, **kwargs)
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
func | — | 接收整个子组作为参数,返回布尔值;True 保留该组,False 丢弃该组 |
dropna | True | 是否丢弃结果为 NaN 的组 |
*args / **kwargs | — | 传给 func 的额外参数 |
基础示例
import pandas as pd
df = pd.DataFrame({
"部门": ["A", "A", "B", "B", "C", "C"],
"员工": ["张三", "李四", "王五", "赵六", "孙七", "周八"],
"薪资": [8000, 9500, 12000, 11000, 3000, 4000],
})
# 保留【薪资总和 > 15000】的部门
df.groupby("部门").filter(lambda x: x["薪资"].sum() > 15000)
# 保留【组内人数 >= 2】的组
df.groupby("部门").filter(lambda x: len(x) >= 2)
# 保留【组内最高薪资 > 10000】的组
df.groupby("部门").filter(lambda x: x["薪资"].max() > 10000)
# 保留【组内薪资均值 > 5000】的组
df.groupby("部门").filter(lambda x: x["薪资"].mean() > 5000)常用过滤器速查
| 过滤目标 | 写法 |
|---|---|
| 保留总薪资达到阈值的组 | filter(lambda x: x["薪资"].sum() > 阈值) |
| 保留组内记录数 ≥ n 的组 | filter(lambda x: len(x) >= n) |
| 保留组内最小/最大值条件 | filter(lambda x: x["列"].min() > 阈值) |
| 保留包含特定任意值的组 | filter(lambda x: (x["列"] == 值).any()) |
| 保留均值、中位数等达标组 | filter(lambda x: x["列"].mean() > 阈值) |
与布尔索引的区别
filter()是组级过滤(先分组,再决定整组去留);普通布尔索引是行级过滤。
对比示例
# 行级过滤:只保留薪资 > 8000 的行(可能使组不完整)
df[df["薪资"] > 8000]
# 组级过滤:保留【平均薪资 > 8000】的整组数据
df.groupby("部门").filter(lambda x: x["薪资"].mean() > 8000)高级用法:结合条件组合
# 组内人数 >= 2 且 薪资总和 > 15000
df.groupby("部门").filter(lambda x: len(x) >= 2 and x["薪资"].sum() > 15000)
# 使用外部函数作为过滤器
def 大部门(g):
return len(g) >= 2
df.groupby("部门").filter(大部门)相关笔记
- 上一节:分组与聚合-4-变换
- 下一节:分组与聚合-6-应用