我试图在多索引数据框中获取最后一个可行日期:
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')
?
答案 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 suggestion:last_valid_index
-
i.last_valid_index()
('a', Period('2017-02', 'M'))
它有一个姐妹函数first_valid_index
-
i.first_valid_index()
('a', Period('2017-01', 'M'))
除了查询这两个值之外,对这些函数的使用还不多。