熊猫周期索引布尔切片返回整个索引



我正在尝试获取多索引数据帧中的最后一个可行日期:

ix = pd.MultiIndex.from_product([["a"], pd.PeriodIndex(start="2017-01", end="2017-03")])
df = pd.DataFrame(data=[0,1, np.nan], index=ix, columns=["test"])
df # outputs
            test
a   2017-01 0.0
    2017-02 1.0
    2017-03 NaN

到目前为止一切顺利,但是切片并返回最后一个返回整个索引:

df.loc[df["test"].notnull(), "test"].index
MultiIndex(levels=[['a'], [2017-01, 2017-02, 2017-03]], labels=[[0, 0], [0, 1]])

我的想法是这应该返回一个数组.index.levels[1][-1]其中最后一个元素类似于 Period('2017-02')

事实上,它应该,如果你愿意,你可以让它这样做,使用 remove_unused_levels -

i = df.loc[df["test"].notnull(), "test"]
i.index = i.index.remove_unused_levels()
i.index
MultiIndex(levels=[['a'], [2017-01, 2017-02]],
           labels=[[0, 0], [0, 1]])

此函数删除当前数据帧切片中实际不存在的那些级别。


或者,您可以通过查询 values 属性来查看index中的当前值 -

i.index.values
array([('a', Period('2017-01', 'M')), ('a', Period('2017-02', 'M'))], dtype=object)

如果它只是您想要的最后一个有效索引(正如您的问题所暗示的那样(,那么您可以使用@ayhan的建议:last_valid_index -

i.last_valid_index()
('a', Period('2017-02', 'M'))

它有一个姐妹功能,first_valid_index——

i.first_valid_index()
('a', Period('2017-01', 'M'))

除了查询这两个值之外,这些函数没有更多用处。

最新更新