使用压缩列表过滤数据框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用压缩列表过滤数据框相关的知识,希望对你有一定的参考价值。

我有一个数据框架,其中包括两个数据框架列,有一个最小峰值和一个最大峰值。我试图过滤index('Date')值,它是两个峰值之间的时间戳。我想为所有大于min_peak但小于max_peak的日期分配一个0的值,如果是false则分配一个1的值。

Date
2019-02-02    0.3985
2019-09-24    1.4612
2019-12-18    1.5996
2020-03-12    0.0001
Name: min_peak, dtype: float64
Date
2019-07-03    3.4769
2019-11-14    2.9666
2020-03-05    4.6239
2020-06-09    4.3605
Name: max_peak, dtype: float64

我有一个min_peak和max_peak列的压缩日期列表,但不确定如何使用这些值来过滤我的数据框。

[(Timestamp('2019-02-02 00:00:00'), Timestamp('2019-07-03 00:00:00')), (Timestamp('2019-09-24 00:00:00'), Timestamp('2019-11-14 00:00:00')), (Timestamp('2019-12-18 00:00:00'), Timestamp('2020-03-05 00:00:00')), (Timestamp('2020-03-12 00:00:00'), Timestamp('2020-06-09 00:00:00'))]

作为一个例子,我将根据前两个峰值来过滤我的数据帧。'2019-02-02 00:00:00'2019-07-03 00:00:00 对于所有指数值大于 2019-02-02 00:00:00 但小于'2019-07-03 00:00:00 等于0。

对于所有在 '2019-07-03 00:00:00' 但少于 2019-09-24 00:00:00' 等于1。

我曾试过用 loc 方法和 df.index.isin 但没有成功。

答案

IIUC你要设置一个新的colum(flag 在我的例子中)到 1 如果指数(Date)在列表中的任何一个元组中。你可以使用 IntervalIndexget_indexer 它将返回索引位置 (>= 0)中的intervall指数或 -1 如果日期不在索引的任何区间。

例如:

import pandas as pd
from pandas import Timestamp

#make sample data
df = pd.DataFrame(index=pd.date_range('2019-01-01', '2020-06-15', freq='W'))
df['flag'] = 0

#make IntervalIndex
l = [(Timestamp('2019-02-02 00:00:00'), Timestamp('2019-07-03 00:00:00')), (Timestamp('2019-09-24 00:00:00'), Timestamp('2019-11-14 00:00:00')), (Timestamp('2019-12-18 00:00:00'), Timestamp('2020-03-05 00:00:00')), (Timestamp('2020-03-12 00:00:00'), Timestamp('2020-06-09 00:00:00'))]
idx = pd.IntervalIndex.from_tuples(l)


#set flag to 1 for all index values within given intervals
df.loc[idx.get_indexer(df.index)>=0, 'flag'] = 1

以上是关于使用压缩列表过滤数据框的主要内容,如果未能解决你的问题,请参考以下文章

将过滤器列表应用于来自使用 pandas 的列表的数据框

根据字符串列表过滤熊猫中的数据框

Python- 在 Pandas Slicer 中解压列表

如何将 dplyr 过滤器应用于数据框列表?

asp:gridview 过滤器使用列表框不能进行多选

VBA Excel - 如何修复列表框表单上的过滤器代码