Pandas 中文手册

12.4 按范围筛选(常用)

Pandas 范围筛选全攻略:数值、日期、索引筛选详解

Pandas 中文手册

本章节深入讲解Pandas中按范围筛选数据的四种常用方法:基础范围筛选、数值范围使用between、日期范围结合between和dt属性、索引范围利用slice和切片,帮助数据分析新手快速上手并优化数据处理流程。

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

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

了解更多

Pandas 范围筛选详解

在数据分析和处理中,根据特定范围筛选数据是常见操作。Pandas 提供了多种灵活方法来实现精确的范围筛选,从而提升数据处理效率和准确性。本章节将详细介绍四种常用范围筛选方式:常用范围筛选、数值范围筛选(使用between方法)、日期范围筛选(结合between方法和dt属性)、索引范围筛选(使用slice方法)。内容简单易懂,适合新手学习。

1. 常用范围筛选

常用范围筛选是最基础的方法,通过比较运算符(如 <, >, <=, >=)和逻辑运算符(如 & 表示“与”)来组合条件,筛选DataFrame中符合条件的行。这种方法直观但代码可能较长。

示例: 假设我们有一个DataFrame df,包含数值列 'value',我们想筛选出值在10到20之间(不包括边界)的行。

import pandas as pd

# 创建一个示例DataFrame
df = pd.DataFrame({'value': [5, 15, 25, 10, 30]})
print("原始数据:")
print(df)

# 使用比较运算符筛选
filtered_df = df[(df['value'] > 10) & (df['value'] < 20)]
print("\n筛选结果(值在10到20之间,不包括边界):")
print(filtered_df)

输出:

原始数据:
   value
0      5
1     15
2     25
3     10
4     30

筛选结果(值在10到20之间,不包括边界):
   value
1     15

此方法适用于简单范围筛选,但可以使用更简洁的between方法替代。

2. 数值范围筛选(between方法)

Pandas 的 between 方法是专门为范围检查设计的,语法简洁且支持边界控制。它返回一个布尔序列,可直接用于索引筛选。

语法: Series.between(left, right, inclusive='both')

  • left:范围左边界
  • right:范围右边界
  • inclusive:可选参数,控制边界包含情况,默认为 'both'(包含左右边界),可选 'neither'(不包含边界)、'left'(仅包含左边界)、'right'(仅包含右边界)

示例: 使用between方法筛选 df['value'] 在10到20之间(包括10,不包括20)的行。

# 使用between方法筛选
filtered_df = df[df['value'].between(10, 20, inclusive='left')]
print("使用between筛选(包括10,不包括20):")
print(filtered_df)

输出:

使用between筛选(包括10,不包括20):
   value
1     15
3     10

between 方法简化了代码,特别适合处理数值范围筛选。

3. 日期范围筛选(between方法、dt属性配合)

对于日期数据,between 方法同样适用。首先需要确保日期列是datetime类型(可使用 pd.to_datetime 转换),然后进行筛选。结合Pandas的 dt 属性,可以轻松访问日期的年份、月份等组件,实现更精细的筛选。

示例: 创建一个包含日期的DataFrame,筛选日期在 '2023-01-02' 到 '2023-01-04' 之间的行。

# 创建包含日期的DataFrame
df_date = pd.DataFrame({
    'date': pd.date_range('2023-01-01', periods=5),
    'data': [10, 20, 30, 40, 50]
})
print("原始日期数据:")
print(df_date)

# 筛选日期范围
start_date = pd.to_datetime('2023-01-02')
end_date = pd.to_datetime('2023-01-04')
filtered_df = df_date[df_date['date'].between(start_date, end_date)]
print("\n筛选日期在2023-01-02到2023-01-04之间(包含边界):")
print(filtered_df)

输出:

原始日期数据:
        date  data
0 2023-01-01    10
1 2023-01-02    20
2 2023-01-03    30
3 2023-01-04    40
4 2023-01-05    50

筛选日期在2023-01-02到2023-01-04之间(包含边界):
        date  data
1 2023-01-02    20
2 2023-01-03    30
3 2023-01-04    40

配合dt属性示例: 筛选日期列中月份为1的数据。

# 使用dt属性筛选月份
filtered_month = df_date[df_date['date'].dt.month == 1]
print("\n筛选1月份的数据:")
print(filtered_month)

输出:

筛选1月份的数据:
        date  data
0 2023-01-01    10
1 2023-01-02    20
2 2023-01-03    30
3 2023-01-04    40
4 2023-01-05    50

dt 属性提供 yearmonthday 等访问器,使日期操作更加灵活。

4. 索引范围筛选(slice方法)

在Pandas中,索引范围筛选通常通过 loc(基于标签)或 iloc(基于整数位置)结合切片实现。slice 方法可用于生成切片对象,方便在复杂场景下使用。

示例: 使用 iloc 基于整数位置筛选行索引范围(例如筛选第1到第2行,Python索引从0开始)。

# 使用iloc进行索引切片
filtered_by_index = df.iloc[1:3]  # 筛选索引1到2的行
print("使用iloc筛选索引1到2的行:")
print(filtered_by_index)

输出:

使用iloc筛选索引1到2的行:
   value
1     15
2     25

示例: 使用 loc 基于标签筛选,假设DataFrame有自定义索引。

# 设置自定义索引并筛选标签范围
df_indexed = df.set_index('value')
filtered_by_label = df_indexed.loc[10:20]  # 筛选标签在10到20之间的行(包括边界)
print("\n使用loc筛选标签10到20的行(设置索引后):")
print(filtered_by_label)

输出:

使用loc筛选标签10到20的行(设置索引后):
       value
value      
15       15
10       10

使用slice方法示例: slice 可以创建切片对象,用于更动态的索引筛选。

# 使用slice方法生成切片对象
s = slice(1, 3)  # 相当于索引1到2
filtered_slice = df.iloc[s]
print("\n使用slice对象筛选索引范围:")
print(filtered_slice)

输出:

使用slice对象筛选索引范围:
   value
1     15
2     25

总结

本章节详细介绍了Pandas中按范围筛选数据的四种方法:

  1. 常用范围筛选:使用比较和逻辑运算符,适合简单场景。
  2. 数值范围筛选:推荐使用 between 方法,语法简洁且边界可控。
  3. 日期范围筛选:结合 between 方法和 dt 属性,处理日期数据高效灵活。
  4. 索引范围筛选:通过 locilocslice 方法,实现基于标签或位置的切片筛选。

在实际应用中,建议根据数据类型和需求选择最合适的方法。数值和日期数据优先使用 between,索引筛选则用 loc/iloc 结合切片。掌握这些技巧能显著提升数据处理能力。

最佳实践提示: 在处理大型数据集时,使用向量化方法(如 between)通常比循环更高效;确保日期数据正确转换为datetime类型以避免错误;对于索引操作,明确使用 lociloc 以避免混淆。

通过本章学习,您应该能够熟练应用Pandas进行各种范围筛选,为数据分析和处理打下坚实基础。

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

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

获取工具包