本文目录导读:

Python 中实现数据筛选有多种方式,取决于你使用的数据结构(列表、字典、NumPy 数组、Pandas DataFrame 等),下面我会从基础到常用库(特别是 Pandas,因为它在数据处理中最常用)逐一给出案例。
基础数据结构:列表 (List) 筛选
使用 列表推导式 (List Comprehension) 或 filter() 函数。
案例:筛选出所有大于 10 的偶数。
numbers = [1, 5, 12, 15, 18, 21, 24, 30] # 方法1: 列表推导式(最 Pythonic) filtered = [x for x in numbers if x > 10 and x % 2 == 0] print(filtered) # 输出: [12, 18, 24, 30] # 方法2: filter() 函数 + lambda filtered2 = list(filter(lambda x: x > 10 and x % 2 == 0, numbers)) print(filtered2) # 输出: [12, 18, 24, 30]
字典 (Dict) 筛选
通常根据键或值进行筛选。
案例:筛选出所有分数大于 80 的学生。
scores = {
'Alice': 85,
'Bob': 63,
'Charlie': 92,
'David': 78,
'Eva': 90
}
# 方法1: 字典推导式
high_scores = {name: score for name, score in scores.items() if score > 80}
print(high_scores) # 输出: {'Alice': 85, 'Charlie': 92, 'Eva': 90}
# 方法2: 只获取符合条件的名字
high_score_names = [name for name, score in scores.items() if score > 80]
print(high_score_names) # 输出: ['Alice', 'Charlie', 'Eva']
Pandas 库——最常用的数据筛选
Pandas 是 Python 数据分析的核心库,提供了非常直观的条件筛选语法。
假设我们有一个关于员工信息的 CSV 或者 DataFrame:
import pandas as pd
# 创建示例 DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'age': [28, 35, 22, 45, 31],
'department': ['IT', 'HR', 'IT', 'Finance', 'HR'],
'salary': [60000, 55000, 70000, 80000, 52000]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
输出:
name age department salary
0 Alice 28 IT 60000
1 Bob 35 HR 55000
2 Charlie 22 IT 70000
3 David 45 Finance 80000
4 Eva 31 HR 52000
1 单条件筛选
案例:选出所有 IT 部门的员工。
it_dept = df[df['department'] == 'IT'] print(it_dept)
输出:
name age department salary
0 Alice 28 IT 60000
2 Charlie 22 IT 70000
2 多条件筛选(使用 & 与 )
案例:选出 IT 部门且年龄大于 25 的员工。
# 注意:每个条件要用括号括起来 result = df[(df['department'] == 'IT') & (df['age'] > 25)] print(result)
输出:
name age department salary
0 Alice 28 IT 60000
案例:选出 HR 部门 OR 薪资大于 70000 的员工。
result = df[(df['department'] == 'HR') | (df['salary'] > 70000)] print(result)
输出:
name age department salary
1 Bob 35 HR 55000
3 David 45 Finance 80000
4 Eva 31 HR 52000
3 使用 isin() 筛选多个值
案例:选出部门为 'IT' 或 'HR' 的员工。
result = df[df['department'].isin(['IT', 'HR'])] print(result)
输出:
name age department salary
0 Alice 28 IT 60000
1 Bob 35 HR 55000
2 Charlie 22 IT 70000
4 Eva 31 HR 52000
4 使用 str.contains() 进行文本模糊筛选
案例:选出名字中包含 'li' 的员工(大小写不敏感)。
# 注意:默认可选参数 case=False 忽略大小写
result = df[df['name'].str.contains('li', case=False)]
print(result)
输出:
name age department salary
0 Alice 28 IT 60000
2 Charlie 22 IT 70000
5 使用 query() 方法(更接近 SQL 语法)
案例:选出年龄小于 30 且薪资大于 55000 的员工。
result = df.query("age < 30 and salary > 55000")
print(result)
输出:
name age department salary
0 Alice 28 IT 60000
2 Charlie 22 IT 70000
NumPy 数组筛选
NumPy 数组支持布尔索引。
案例:筛选出数组中所有大于 50 的元素。
import numpy as np arr = np.array([15, 45, 60, 78, 32, 90, 10]) # 布尔索引 filtered_arr = arr[arr > 50] print(filtered_arr) # 输出: [60 78 90]
综合案例:从 CSV 文件读取并筛选
将上面的知识结合起来,模拟真实场景:
import pandas as pd
# 假设从文件读取数据
df = pd.read_csv('employees.csv')
# 筛选出:
# - 年龄 30~40 岁
# - 薪资大于 60000
# - 部门不是 'Intern'
result = df[
(df['age'] >= 30) & (df['age'] <= 40) &
(df['salary'] > 60000) &
(df['department'] != 'Intern')
]
print(result.head())
总结对比表
| 数据结构 | 常用筛选方式 | 适用场景 |
|---|---|---|
| 列表 | 列表推导式 [x for x in lst if cond] |
简单纯 Python 数据 |
| 字典 | 字典推导式 {k:v for k,v in dct if cond} |
小型键值对数据 |
| NumPy 数组 | arr[condition] 布尔索引 |
数值计算、科学计算 |
| Pandas DataFrame | df[condition], query(), isin(), str.contains() |
表格数据分析、数据清洗 |
掌握这些方法,你就能应对绝大多数 Python 数据处理场景,如果数据量很大(数万行以上),建议优先使用 Pandas,因为它经过底层优化,性能更好且语法简洁。