引言:为什么条件筛选是数据分析的核心技能?
在处理真实数据时,我们常常面临这样的需求:
- 从销售数据中找出销售额超过10万的订单
- 筛选出年龄在18-25岁之间的用户群体
- 提取特定时间段内的日志记录
这些场景都离不开 条件筛选 ------它是数据清洗、探索性分析(EDA)和特征工程的基础。本文将通过 5个核心方法 + 3个实战案例,带你掌握Pandas中条件筛选的精髓。
一、基础条件筛选:布尔索引(Boolean Indexing)
1. 单条件筛选
假设有一个学生成绩表 df_students:
python
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Score': [85, 92, 78, 88],
'Grade': ['B', 'A', 'C', 'B']
}
df_students = pd.DataFrame(data)
需求 :筛选出分数 ≥90 的学生
python
high_scores = df_students[df_students['Score'] >= 90]
print(high_scores)
输出:
Name Score Grade
1 Bob 92 A
2. 多条件组合筛选(与/或/非)
使用 &(与)、|(或)、~(非)组合多个条件,必须用括号包裹每个条件!
需求 :筛选出 分数≥80 且 等级为B 的学生
python
filtered = df_students[(df_students['Score'] >= 80) & (df_students['Grade'] == 'B')]
print(filtered)
输出:
Name Score Grade
0 Alice 85 B
3 David 88 B
二、进阶筛选技巧
1. 使用 query() 方法(代码更简洁)
对于复杂条件,query() 可以避免冗长的括号嵌套:
python
# 等价于 (Score >= 80) & (Grade == 'B')
filtered = df_students.query("Score >= 80 and Grade == 'B'")
2. isin() 方法:筛选多个特定值
需求 :找出 等级为A或C 的学生
python
filtered = df_students[df_students['Grade'].isin(['A', 'C'])]
print(filtered)
输出:
Name Score Grade
1 Bob 92 A
2 Charlie 78 C
3. str.contains():字符串模糊匹配
需求 :筛选名字中包含 'li' 的学生(不区分大小写)
python
filtered = df_students[df_students['Name'].str.contains('li', case=False)]
print(filtered)
输出:
Name Score Grade
0 Alice 85 B
2 Charlie 78 C
三、实战案例:从电商数据中提取关键信息
假设有一个电商订单数据集 df_orders:
python
orders_data = {
'OrderID': [1001, 1002, 1003, 1004],
'CustomerID': [C001, C002, C001, C003],
'Amount': [120, 45, 200, 80],
'Date': ['2023-01-15', '2023-01-20', '2023-02-05', '2023-02-10'],
'Category': ['Electronics', 'Clothing', 'Electronics', 'Food']
}
df_orders = pd.DataFrame(orders_data)
案例1:筛选高价值订单(金额>100)
python
high_value_orders = df_orders[df_orders['Amount'] > 100]
案例2:筛选2023年2月的电子产品订单
python
import datetime
df_orders['Date'] = pd.to_datetime(df_orders['Date']) # 转换日期格式
feb_electronics = df_orders[
(df_orders['Date'].dt.month == 2) &
(df_orders['Category'] == 'Electronics')
]
案例3:统计每个客户的订单总数(分组+筛选)
python
customer_stats = df_orders.groupby('CustomerID').size().reset_index(name='OrderCount')
frequent_customers = customer_stats[customer_stats['OrderCount'] > 1]
四、常见错误与避坑指南
-
忘记加括号 :
❌ 错误写法:
df[df['A'] > 1 & df['B'] < 2]✅ 正确写法:
df[(df['A'] > 1) & (df['B'] < 2)] -
字符串比较未加引号 :
❌
df[df['Grade'] == A]✅
df[df['Grade'] == 'A'] -
日期筛选前未转换格式 :
确保先用
pd.to_datetime()转换日期列,否则无法用.dt访问年月日。
总结:条件筛选的"三步法"
- 明确需求:确定要筛选的列和条件逻辑
- 构建条件 :用
>、==、isin()等生成布尔序列 - 应用筛选 :通过
df[condition]或query()提取数据
下一步建议:
- 尝试在真实数据集(如Kaggle的Titanic或电商数据)中练习
- 学习
loc[]和iloc[]实现更复杂的行列筛选 - 探索Dask或PySpark处理超大规模数据的条件筛选
附:完整代码示例
GitHub Gist链接(可替换为实际代码仓库链接)
希望这篇博客能帮助你彻底掌握DataFrame条件筛选!如果有任何疑问,欢迎在评论区交流 🚀