Pandas PeriodIndex布尔片返回整个索引

时间:2017-12-29 20:28:33

标签: python pandas

我试图在多索引数据框中获取最后一个可行日期:

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')

1 个答案:

答案 0 :(得分:3)

事实上,它应该,如果你愿意的话,你可以使用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]])

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

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

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

如果它只是您想要的最后一个有效索引(正如您提出的问题所示),那么您可以使用@ayhan's suggestionlast_valid_index -

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

它有一个姐妹函数first_valid_index -

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

除了查询这两个值之外,对这些函数的使用还不多。