gpt4 book ai didi

python - 是否可以在 Pandas 中将 searchsorted 与 MultiIndex 索引一起使用?

转载 作者:行者123 更新时间:2023-12-05 05:28:12 27 4
gpt4 key购买 nike

我有一个具有 MultiIndex 索引的 DataFrame。它可以按如下方式重新生成:

import pandas as pd
import numpy as np
from numpy.random import randn as randn
from numpy.random import randint as randint
from datetime import datetime
# setup data
obs1 = [ob if ob > 0 else ob *-1 for ob in randn(10)*100]
obs2 = [randint(1000) for i in range(10)]
labels = ['A12', 'B12', 'A12', 'A12', 'A12','B12', 'A12','B12', 'A13', 'B13']
dates = [datetime(2012, 11, i) for i in range(1,11)]
dates[0] = dates[1]
dates[5] = dates[6]
# setup index and dataframe
m_idx = pd.MultiIndex.from_tuples(zip(dates, labels), names=['date', 'label'])
data_dict = {'observation1':obs1, 'observation2':obs2}
df = pd.DataFrame(data_dict, index=m_idx)

输出:

In [17]: df
Out[17]:
observation1 observation2
date label
2012-11-02 A12 79.373668 224
B12 130.841316 477
2012-11-03 A12 45.312814 835
2012-11-04 A12 163.776946 623
2012-11-05 A12 115.449437 722
2012-11-07 B12 38.537737 842
A12 84.807516 396
2012-11-08 B12 35.186265 707
2012-11-09 A13 60.171620 336
2012-11-10 B13 123.750614 540

感兴趣的日期:

dates_of_interest = [datetime(2012,11,1), datetime(2012,11,6)]

我有兴趣创建具有以下条件子集的数据框:

  • 日期最接近感兴趣的日期之一
  • 标签在字符串中有'A'

因此我的子索引的结果如下所示:

                  observation1  observation2
date label
2012-11-02 A12 79.373668 224
2012-11-07 A12 84.807516 396

理想情况下,我将能够获取“接近”标准的所有观察数据,这样返回的数据集可能如下所示:

                  observation1  observation2
date label
2012-11-02 A12 79.373668 224
2012-11-05 A12 115.449437 722
2012-11-07 A12 84.807516 396

但一开始我会很高兴得到第一个结果。我怀疑我需要使用 searchsort 和 asof,但我不太确定如何使用。一个多索引。

有谁知道从这里怎么走?

问候

最佳答案

使用 Series.asof 是一种自然的方式,但我发现了一些缺点:

  • 您正在寻找接近 的时间戳,其中asof 搜索最新 时间戳。在您的示例中,如果您搜索 datetime(2012, 11, 1)(早于 df 中的任何条目),您将得到一个 NaN.
  • 它仅适用于时间序列,因此您必须将 reset_index 应用于您的 DataFrame然后选择一些任意列作为时间序列。换句话说,它使您的代码有点笨拙和复杂。

这是解决您的第一个任务的更强大的替代方法,您可以使用 numpy.searchsorted 在时间戳索引中搜索近似命中。 :

import numpy as np

# it is important that df is sorted by date
df.sort_index(inplace=True)

dates_ix = df.index.levels[0]
nearest_date = lambda date: dates_ix[np.searchsorted(dates_ix, date)]
approx_dates = map(nearest_date, dates_of_interest)
# select the desired entries in the index
df.select(lambda (date, label): (date in approx_dates and
label.find('A')!=-1))

关于python - 是否可以在 Pandas 中将 searchsorted 与 MultiIndex 索引一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13165461/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com