gpt4 book ai didi

python - 唯一索引和单调索引有什么区别?

转载 作者:行者123 更新时间:2023-12-04 10:20:11 24 4
gpt4 key购买 nike

我正在尝试使用 pandas.Index.get_loc返回最近值的索引(作为 int),但有时它会返回 slice 对象。根据文档,

get_loc returns int if unique index, slice if monotonic index, else mask.

但看起来行为并不一致。例如,使用以下索引:

idx = pd.DatetimeIndex(['2019-12-24 12:04:54',
'2019-12-26 20:09:22',
'2020-12-27 07:44:35'])

使用 idx.get_loc('2019-12-27', method='ffill') 返回 slice(2, 2, None),而 idx.get_loc('2019-12-29', method='ffill') 返回 2。将方法从 'ffill' 更改为 'bfill' 似乎不会改变结果。

我的目标是像 idx[:i] 这样从索引的开头切分所有点,其中 iget_loc 返回的 int >。如果可能的话,另一个解决方案可能是修改 slice 对象的开头。

编辑:显然,slice 是具有只读 数据属性开始、停止和步进的内置对象(参见文档 here)。这意味着您可以检查 get_loc 的结果是否为 int,如果不是,则使用 idx[:slice.stop] 获取所有元素达到所需的索引。

不过我仍然对原来的问题感兴趣。

最佳答案

让我们从基本定义开始。

唯一索引

唯一索引 是包含非重复标签的索引。在这样的索引中,不能有两个或更多相同的标签。

要检查给定索引是否唯一,可以使用 pd.Index.is_unique 属性,例如:

>>> pd.Index(['s', 'a', 'm']).is_unique
True
>>> pd.Index(['s', 'a', 'm', 'a']).is_unique
False

如文档所述,此类索引的一个示例是 pd.Index(list('abc')),包含三个唯一标签 abc,这恰好也是单调的。 唯一的非单调索引可以是,例如,pd.Index(list('acb')),它在从 cb

单调索引

单调性是一种数学属性,表示给定函数在其整个域内保持非递增或非递减顺序。在 Pandas 中,单调索引 是遵循此属性的索引。

与唯一性类似,您可以使用属性 pd.Index.is_monotonic 或其衍生物,即 pd.Index.is_monotonic_increasingpd.Index.is_monotonic_decreasing.

在这种情况下,文档提供了另一个示例:pd.Index(list('abbc')),这是一个具有重复标签 b 。还提到了非唯一非单调索引 pd.Index(list('abcb'))。重复的标签再次是 b 而顺序在 c -> b 处被打破,这与之前建立的顺序 a -> b -> c.


pd.Index.get_loc

这个 pandas Index 方法使用前面定义的概念来确定它的返回值。其预期行为指定如下。如果一个索引是唯一的,那么它应该返回一个 int 索引值。如果它不是唯一的,则该方法会考虑索引的单调性。如果恰好是单调的,则返回一个slice。否则,它返回一个掩码。

您的示例索引 idx 是唯一的(并且单调,尽管它是无关紧要的),因此您会期望 get_loc 应该返回一个 int。但是,这仅对精确 标签匹配有保证。对于部分匹配项(例如您正在使用的匹配项),情况并非如此。我将向您展示显示用法差异的输出:

>>> idx.get_loc('2019-12-24')
slice(0, 1, None)
>>> idx.get_loc('2019-12-24 12:04:54')
0

关于python - 唯一索引和单调索引有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60901078/

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