根据条件获取pandas multiindex中的索引值

Posted

技术标签:

【中文标题】根据条件获取pandas multiindex中的索引值【英文标题】:Getting index value in pandas multiindex based on condition 【发布时间】:2021-10-12 18:49:04 【问题描述】:

我使用以下代码创建了一个数据框: 这样做的目的是找到每周低点并获得每周低点发生的日期。 为此:

import pandas as pd
from pandas_datareader import data as web
import pandas_datareader
import datetime

df = web.DataReader('GOOG', 'yahoo', start, end)
df2 = web.DataReader('GOOG', 'yahoo', start, end)
start = datetime.datetime(2021,1,1)
end = datetime.datetime.today()

df['Date1'] = df.index

df['month'] = df.index.month
df['week'] = df.index.week
df['day'] = df.index.day
df.set_index('week',append=True,inplace=True)
df.set_index('day',append=True,inplace=True)

要获得每周最低价:

df['Low'].groupby(['week']).min().tail(50)

我试图找出出现每周低点的日期:例如 1735.420044

如果我尝试这样做:

df['Low'].isin([1735.420044])

我明白了:

Date        week  day
2020-12-31  53    31     False
2021-01-04  1     4      False
2021-01-05  1     5      False
2021-01-06  1     6      False
2021-01-07  1     7      False
                         ...  
2021-08-02  31    2      False
2021-08-03  31    3      False
2021-08-04  31    4      False
2021-08-05  31    5      False
2021-08-06  31    6      False
Name: Low, Length: 151, dtype: bool

我怎样才能得到低点的实际日期?

【问题讨论】:

使用df['Low'].idxmin() - 这将返回最小值标签的索引。 我正在尝试获取每周低点的日期。这就是为什么我对它进行多重索引以获得每周的价值。 你总是可以按周分组,然后使用 idxmin 这能回答你的问题吗? Get lowest value after groupby - Pandas 【参考方案1】:

要获得每周低点,您只需访问该指数即可。

res = df['Low'].groupby(['week']).min()

res 是指数中包含日期的最低价格系列。您可以使用 res.index.values 访问表示索引的原始 numpy 数组。这将包括weekday 级别。

要获取一系列日期,这应该可以:

dates = res.index.get_level_values("Date").to_series() 

PS:来自cmets的澄清

df['Low'].isin([1735.420044]).any() # returns False

上述内容对您不起作用(如果匹配,则应返回True)因为当您说.isin([<bunch of floats>]) 时,您实际上是在比较浮点数是否相等。这不起作用,因为浮点比较永远不能保证是准确的,它们总是必须在公差范围内(这不是 Python 特定的,适用于所有语言)。有时它似乎可以在 Python 中工作,但这完全是巧合,是底层内存优化的结果。查看this thread 以获得一些(特定于 Python 的)对此的了解。

【讨论】:

我最初尝试过,但这只是给了我一个空数据框 @Slartibartfast 那么你没有匹配,你可以用df['Low'].isin([1735.420044]).any()检查。如果返回 False,则没有匹配项,可能是因为您正在尝试比较浮点数。浮点数的精确比较是不可预测的,不推荐使用。 它返回 False 但是当我们可以在数据框中看到它时怎么可能呢? 您无法与浮点数进行精确比较, 所以我不能做这样的事情吗? df.where(df['Low'].groupby(['week']).min())

以上是关于根据条件获取pandas multiindex中的索引值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 高效的 Multiindex 获取和设置

Pandas:使用 MultiIndex 列按不同列聚合

在 Multiindex Pandas 系列中获取每个组中最大的

根据列值对带有 MultiIndex 的 pandas DataFrame 进行排序

Pandas GroupBy 和 MultiIndex 上列级别的最大值

Pandas:按值过滤,然后在 Multiindex 中获取最大值