
本文介绍使用 pandas 对 dataframe 进行多列联合条件筛选的高效方法:仅保留至少在两个数值列中满足指定阈值(如 ≥4)的行,适用于学生成绩、多维度评分等场景。
本文介绍使用 pandas 对 dataframe 进行多列联合条件筛选的高效方法:仅保留至少在两个数值列中满足指定阈值(如 ≥4)的行,适用于学生成绩、多维度评分等场景。
在数据分析中,常需基于多个字段的组合逻辑进行行过滤。例如,判断学生是否“整体表现良好”,不能仅依赖单科高分,而应要求至少两门运动成绩 ≥4 分。此时,传统用 |(或)连接各列的布尔表达式不再适用——它只检测“任一满足”,而非“至少两个满足”。
Pandas 提供了简洁优雅的向量化解决方案,核心思路是:
- 排除非数值列(如姓名);
-
对目标列批量执行比较操作(如
>=4),生成布尔矩阵; -
按行求和(
sum(axis=1)),统计每行满足条件的列数; - 再次比较该计数是否 ≥2,得到最终布尔索引。
以下为完整可运行代码:
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)
# 筛选:在 Football、Basketball、Volleyball、Foosball 中,
# 至少有两列的值 >= 4
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
✅ 关键点说明:
-
df.drop(columns=['Names'])安全移除非参与计算的标识列,避免类型错误; -
.ge(4)是>=4的函数式写法,比>=4更易链式调用; -
sum(axis=1)将布尔值(True/False)自动转为1/0求和,无需额外转换; - 整个过程完全向量化,无循环、无
apply(),性能优异,适合大规模数据。
⚠️ 注意事项:
- 若存在缺失值(
NaN),.ge(4)会返回False,可能影响计数。如有需要,建议先用fillna()或dropna()处理; - 列名列表可动态构造(如
score_cols = ['Football','Basketball','Volleyball','Foosball']),再用df[score_cols].ge(4).sum(axis=1) >= 2,提升可维护性; - 此模式可扩展至“至少 N 列满足条件”(只需修改末尾数字,如
>=3)或“所有列均满足”(用.all(axis=1))。
掌握这一技巧,能显著简化复杂多列逻辑筛选,让 Pandas 数据清洗更精准、更高效。











