使用压缩列表过滤数据框
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
)在列表中的任何一个元组中。你可以使用 IntervalIndex
和 get_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
以上是关于使用压缩列表过滤数据框的主要内容,如果未能解决你的问题,请参考以下文章