12.1 单条件筛选(基础,常用)
Pandas单条件筛选全面指南:从数值、字符串到日期筛选
本章节详细介绍Pandas中单条件筛选的基础用法,涵盖数值型数据的比较操作、字符串型数据的模式匹配、日期型数据的范围筛选,以及如何直接使用布尔索引进行高效数据过滤。适合Pandas新手快速上手。
单条件筛选: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筛选数据的强大工具。无论数据类型如何,基本原理都是创建布尔条件并使用它来选取数据行。新手应先掌握单个条件的筛选,再逐步学习多条件组合。实践中,注意数据类型的转换(如日期)和字符串操作的方法。