Pandas 中文手册

12.1 单条件筛选(基础,常用)

Pandas单条件筛选全面指南:从数值、字符串到日期筛选

Pandas 中文手册

本章节详细介绍Pandas中单条件筛选的基础用法,涵盖数值型数据的比较操作、字符串型数据的模式匹配、日期型数据的范围筛选,以及如何直接使用布尔索引进行高效数据过滤。适合Pandas新手快速上手。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

单条件筛选:Pandas布尔索引的基础

在Pandas中,单条件筛选是数据处理中最常用的操作之一,它允许您基于一个条件快速过滤数据。这主要通过布尔索引实现,即创建一个布尔值的Series(True或False),然后用它来选取满足条件的数据行。本章将详细介绍数值型、字符串型和日期型数据的单条件筛选,并展示如何直接使用布尔索引表达式。

1. 数值型数据单条件筛选

数值型数据可以使用简单的比较操作符(如大于、小于、等于)进行筛选。假设我们有一个DataFrame df,包含一个数值列 score

示例代码:

import pandas as pd

# 创建一个示例DataFrame
data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'score': [85, 92, 78, 88]
}
df = pd.DataFrame(data)

# 筛选score大于85的数据
df_greater = df[df['score'] > 85]
print("分数大于85的行:")
print(df_greater)

# 筛选score小于80的数据
df_less = df[df['score'] < 80]
print("\n分数小于80的行:")
print(df_less)

# 筛选score等于88的数据
df_equal = df[df['score'] == 88]
print("\n分数等于88的行:")
print(df_equal)

输出示例:

分数大于85的行:
     name  score
1     Bob     92
3   David     88

分数小于80的行:
      name  score
2  Charlie     78

分数等于88的行:
    name  score
3  David     88

关键点:使用df['列名'] > 值这样的表达式生成布尔索引,然后用它直接筛选DataFrame。

2. 字符串型数据单条件筛选

对于字符串数据,Pandas提供了.str访问器,支持各种字符串操作。常见的筛选包括判断是否包含特定文本、以某字符串开头或结尾。

示例代码:

import pandas as pd

# 创建一个示例DataFrame
data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'email': ['alice@example.com', 'bob@gmail.com', 'charlie@test.org', 'david@example.com']
}
df = pd.DataFrame(data)

# 筛选包含'example.com'的email
df_contains = df[df['email'].str.contains('example.com')]
print("包含'example.com'的email:")
print(df_contains)

# 筛选以'al'开头的name
df_starts = df[df['name'].str.startswith('Al')]
print("\n以'Al'开头的name:")
print(df_starts)

# 筛选以'e'结尾的name(注意:字符串操作是大小写敏感的)
df_ends = df[df['name'].str.endswith('e')]
print("\n以'e'结尾的name:")
print(df_ends)

输出示例:

包含'example.com'的email:
    name               email
0  Alice  alice@example.com
3  David  david@example.com

以'Al'开头的name:
    name               email
0  Alice  alice@example.com

以'e'结尾的name:
    name               email
0  Alice  alice@example.com

提示:.str.contains()默认区分大小写,可以使用参数case=False忽略大小写。

3. 日期型数据单条件筛选

日期数据需要先转换为Pandas的datetime类型,然后使用日期比较进行筛选。常见操作包括筛选大于某个日期或在某个日期区间内。

示例代码:

import pandas as pd

# 创建一个示例DataFrame,包含日期列
data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'date': ['2023-01-01', '2023-02-15', '2023-03-10', '2023-04-20']
}
df = pd.DataFrame(data)
# 将'date'列转换为datetime类型
df['date'] = pd.to_datetime(df['date'])

# 筛选date大于'2023-02-01'的数据
df_greater_date = df[df['date'] > '2023-02-01']
print("日期大于2023-02-01的行:")
print(df_greater_date)

# 筛选date在'2023-02-01'到'2023-03-31'之间的数据(区间筛选)
df_interval = df[(df['date'] >= '2023-02-01') & (df['date'] <= '2023-03-31')]
print("\n日期在2023-02-01到2023-03-31之间的行:")
print(df_interval)

输出示例:

日期大于2023-02-01的行:
      name       date
1      Bob 2023-02-15
2  Charlie 2023-03-10
3    David 2023-04-20

日期在2023-02-01到2023-03-31之间的行:
      name       date
1      Bob 2023-02-15
2  Charlie 2023-03-10

注意:使用&操作符结合多个条件时,需要用括号括起每个条件,以避免歧义。

4. 布尔索引的直接使用(条件表达式)

布尔索引的核心是直接使用条件表达式生成布尔值Series。您可以灵活组合这些表达式,Pandas会自动处理布尔逻辑。

示例代码:

import pandas as pd

# 创建一个示例DataFrame
data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'score': [85, 92, 78, 88],
    'passed': [True, True, False, True]
}
df = pd.DataFrame(data)

# 直接使用布尔索引:筛选score大于80且passed为True的数据
condition = (df['score'] > 80) & (df['passed'] == True)
df_filtered = df[condition]
print("分数大于80且通过的行:")
print(df_filtered)

# 也可以直接使用表达式而不赋给变量
print("\n使用直接表达式筛选: 分数等于78的行")
print(df[df['score'] == 78])

输出示例:

分数大于80且通过的行:
    name  score  passed
0  Alice     85    True
1    Bob     92    True
3  David     88    True

使用直接表达式筛选: 分数等于78的行
      name  score  passed
2  Charlie     78   False

总结:布尔索引是Pandas筛选数据的强大工具。无论数据类型如何,基本原理都是创建布尔条件并使用它来选取数据行。新手应先掌握单个条件的筛选,再逐步学习多条件组合。实践中,注意数据类型的转换(如日期)和字符串操作的方法。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包