12.4 按范围筛选(常用)
Pandas 范围筛选全攻略:数值、日期、索引筛选详解
本章节深入讲解Pandas中按范围筛选数据的四种常用方法:基础范围筛选、数值范围使用between、日期范围结合between和dt属性、索引范围利用slice和切片,帮助数据分析新手快速上手并优化数据处理流程。
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 属性提供 year、month、day 等访问器,使日期操作更加灵活。
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中按范围筛选数据的四种方法:
- 常用范围筛选:使用比较和逻辑运算符,适合简单场景。
- 数值范围筛选:推荐使用
between方法,语法简洁且边界可控。 - 日期范围筛选:结合
between方法和dt属性,处理日期数据高效灵活。 - 索引范围筛选:通过
loc、iloc和slice方法,实现基于标签或位置的切片筛选。
在实际应用中,建议根据数据类型和需求选择最合适的方法。数值和日期数据优先使用 between,索引筛选则用 loc/iloc 结合切片。掌握这些技巧能显著提升数据处理能力。
最佳实践提示: 在处理大型数据集时,使用向量化方法(如 between)通常比循环更高效;确保日期数据正确转换为datetime类型以避免错误;对于索引操作,明确使用 loc 或 iloc 以避免混淆。
通过本章学习,您应该能够熟练应用Pandas进行各种范围筛选,为数据分析和处理打下坚实基础。