如何从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包含未排序的随机日期值时也可以使用的解决方案。有没有办法在大熊猫中做到这一点?
最佳答案
选项1pd.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
请注意,这两个选项都适用于datetime对象以及字符串日期列(在这种情况下,比较是按字典顺序进行的)。