我正在尝试获取多索引数据帧中的最后一个可行日期:
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'))
除了查询这两个值之外,这些函数没有更多用处。