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条件筛选!如果有任何疑问,欢迎在评论区交流 🚀

相关推荐
喵手1 小时前
Python爬虫实战:电商问答/FAQ 语料构建 - 去重、分句、清洗,做检索语料等!
爬虫·python·爬虫实战·faq·零基础python爬虫教学·电商问答·语料构建
musenh1 小时前
python基础
开发语言·windows·python
清水白石0081 小时前
解锁 Python 性能潜能:从基础精要到 `__getattr__` 模块级懒加载的进阶实战
服务器·开发语言·python
清水白石0082 小时前
缓存的艺术:Python 高性能编程中的策略选择与全景实战
开发语言·数据库·python
AI Echoes2 小时前
对接自定义向量数据库的配置与使用
数据库·人工智能·python·langchain·prompt·agent
得一录2 小时前
LoRA(Low-Rank Adaptation)的原理和实现
python·算法·机器学习
喵手2 小时前
Python爬虫实战:同名实体消歧 - 店铺/公司名规则合并与标准化等!
爬虫·python·爬虫实战·零基础python爬虫教学·同名实体消歧·店铺/公司名规则合并与标准化
七夜zippoe2 小时前
集成测试实战:构建可靠的测试金字塔体系
python·log4j·e2e·fastapi·持续集成·flask api
yunhuibin2 小时前
VGGNet网络学习
人工智能·python·深度学习·神经网络·学习