DataFrame条件筛选:从入门到实战的数据清洗利器

引言:为什么条件筛选是数据分析的核心技能?

在处理真实数据时,我们常常面临这样的需求:

  • 从销售数据中找出销售额超过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]

四、常见错误与避坑指南

  1. 忘记加括号

    ❌ 错误写法:df[df['A'] > 1 & df['B'] < 2]

    ✅ 正确写法:df[(df['A'] > 1) & (df['B'] < 2)]

  2. 字符串比较未加引号

    df[df['Grade'] == A]

    df[df['Grade'] == 'A']

  3. 日期筛选前未转换格式

    确保先用 pd.to_datetime() 转换日期列,否则无法用 .dt 访问年月日。


总结:条件筛选的"三步法"

  1. 明确需求:确定要筛选的列和条件逻辑
  2. 构建条件 :用 >==isin() 等生成布尔序列
  3. 应用筛选 :通过 df[condition]query() 提取数据

下一步建议

  • 尝试在真实数据集(如Kaggle的Titanic或电商数据)中练习
  • 学习 loc[]iloc[] 实现更复杂的行列筛选
  • 探索Dask或PySpark处理超大规模数据的条件筛选

附:完整代码示例
GitHub Gist链接(可替换为实际代码仓库链接)

希望这篇博客能帮助你彻底掌握DataFrame条件筛选!如果有任何疑问,欢迎在评论区交流 🚀

相关推荐
lulu12165440789 小时前
Claude Code项目大了响应慢怎么办?Subagents、Agent Teams、Git Worktree、工作流编排四种方案深度解析
java·人工智能·python·ai编程
Ares-Wang9 小时前
Flask》》 Flask-Bcrypt 哈希加密
后端·python·flask
kongba00710 小时前
项目打包 Python Flask 项目发布与打包专家 提示词V1.0
开发语言·python·flask
belldeep10 小时前
介绍 遗传算法 与 TSP问题
python·遗传算法·ga·tsp问题
解救女汉子10 小时前
SQL触发器如何获取触发源应用名_利用APP_NAME函数追踪
jvm·数据库·python
思绪无限11 小时前
YOLOv5至YOLOv12升级:血细胞检测系统的设计与实现(完整代码+界面+数据集项目)
人工智能·python·深度学习·目标检测·计算机视觉·yolov12·血细胞检测
skywalk816313 小时前
发现Kotti项目的python包Beaker 存在安全漏洞
开发语言·网络·python·安全
天天进步201513 小时前
Python全栈项目:从零构建基于 Django 的知识管理系统(KMS)
开发语言·python·django
珎珎啊13 小时前
Python3 迭代器与生成器
开发语言·python
思绪无限14 小时前
YOLOv5至YOLOv12升级:金属锈蚀检测系统的设计与实现(完整代码+界面+数据集项目)
人工智能·python·深度学习·目标检测·计算机视觉·yolov12