
本文介绍使用 pandas 对 dataframe 进行多列联合条件筛选的高效方法:仅保留至少在两个数值列中满足指定阈值(如 ≥4)的行,适用于学生成绩、多维度评分等场景。
本文介绍使用 pandas 对 dataframe 进行多列联合条件筛选的高效方法:仅保留至少在两个数值列中满足指定阈值(如 ≥4)的行,适用于学生成绩、多维度评分等场景。
在实际数据分析中,我们常需基于跨列逻辑进行筛选——例如“学生在任意两门体育课中成绩 ≥4 才视为通过”。这不同于单列或全列条件,也无法直接用多个 |(或)简单拼接。核心思路是:将目标数值列统一与阈值比较,逐行统计达标列数,再按计数过滤。
以下以学生体育成绩为例,完整演示实现过程:
import pandas as pd
Students = {
"Names": ["Tom", "Rick", "Sally", "Sarah"],
"Football": [4, 5, 2, 1],
"Basketball": [4, 2, 4, 2],
"Volleyball": [6, 1, 6, 1],
"Foosball": [4, 3, 4, 3],
}
df = pd.DataFrame(Students)✅ 关键步骤解析:
-
排除非数值列(如姓名):使用
.drop(columns=['Names'])移除标识性列,确保只对成绩列运算; -
批量条件判断:
.ge(4)对所有剩余列执行“≥4”比较,返回布尔 DataFrame; -
逐行计数:
.sum(axis=1)将每行的True(即达标列)求和,得到每名学生达标科目数; -
二次布尔筛选:
.ge(2)判断达标数是否 ≥2,生成最终布尔索引。
一行代码即可完成全部逻辑:
passed_students = df[df.drop(columns=['Names']).ge(4).sum(axis=1) >= 2] print(passed_students)
输出结果:
Names Football Basketball Volleyball Foosball 0 Tom 4 4 6 4 2 Sally 2 4 6 4
? 中间过程可视化(便于调试):
- 布尔矩阵(达标为
True):Football Basketball Volleyball Foosball 0 True True True True # → 4科达标 1 True False False False # → 1科达标 2 False True True True # → 3科达标 3 False False False False # → 0科达标
- 每行达标数:
[4, 1, 3, 0] - 最终筛选条件:
[True, False, True, False]
⚠️ 注意事项:
- 若存在缺失值(
NaN),.ge(4)会返回False,不影响计数;如需特殊处理,建议先用.fillna(); - 列名列表可动态生成(如
score_cols = df.select_dtypes('number').columns.drop('Names')),提升代码可维护性; - 替换
ge(4)为gt(3)效果相同,但语义上ge更直观表达“≥”; - 此方法时间复杂度为 O(m×n),远优于嵌套循环,在万级数据下依然高效。
该模式可轻松扩展至“任意 N 列满足条件”(只需修改末尾的 >= N),是 Pandas 多列逻辑筛选的标准化实践方案。

















