Skip to main content
 首页 » 编程设计

python之选择列值在给定范围之间的行

2025年05月04日22傻小

如何从 DataFrame 中查找和删除值在特定范围内的行,例如日期大于“2017-03-02”且小于“2017-03-05”

import pandas as pd                                      
 
d_index = pd.date_range('2018-01-01', '2018-01-06')      
d_values = pd.date_range('2017-03-01', '2017-03-06')     
 
s = pd.Series(d_values)                                  
s = s.rename('values')                                   
 
df = pd.DataFrame(s)                                     
df = df.set_index(d_index)                               
 
# remove rows with specific values in 'value' column                               

在上面的示例中,我将 d_values 从最早日期排序到最晚日期,因此在这种情况下,按索引对数据帧进行切片可以完成这项工作。但我正在寻找在 d_values 包含未排序的随机日期值时也能工作的解决方案。有没有办法在 Pandas 中做到这一点?

请您参考如下方法:

选项 1
pd.Series.between 似乎适合这项任务。

df[~df['values'].between('2017-03-02', '2017-03-05', inclusive=False)] 
 
               values 
2018-01-01 2017-03-01 
2018-01-02 2017-03-02 
2018-01-05 2017-03-05 
2018-01-06 2017-03-06 

详情
between 标识范围内的所有项 -

m = df['values'].between('2017-03-02', '2017-03-05', inclusive=False) 
m 
 
2018-01-01    False 
2018-01-02    False 
2018-01-03     True 
2018-01-04     True 
2018-01-05    False 
2018-01-06    False 
Freq: D, Name: values, dtype: bool 

使用掩码过滤df -

df = df[~m] 

选项 2
或者,使用良好的旧逻辑或 -

df[~(df['values'].gt('2017-03-02') & df['values'].lt('2017-03-05'))] 
 
               values 
2018-01-01 2017-03-01 
2018-01-02 2017-03-02 
2018-01-05 2017-03-05 
2018-01-06 2017-03-06 

请注意,这两个选项都适用于日期时间对象以及字符串日期列(在这种情况下,比较是字典顺序的)。