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

pad*_*n92 2 python dataframe pandas

如何从 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                              
Run Code Online (Sandbox Code Playgroud)

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

cs9*_*s95 5

选项 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
Run Code Online (Sandbox Code Playgroud)

详细信息标识了范围内的
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
Run Code Online (Sandbox Code Playgroud)

使用面罩过滤df-

df = df[~m]
Run Code Online (Sandbox Code Playgroud)

选项 2
或者,使用古老的逻辑 OR -

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
Run Code Online (Sandbox Code Playgroud)

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