pandas - 多索引切片未按预期调整索引值

时间:2017-01-09 13:41:38

标签: python pandas timestamp multi-index

在Pandas中,我试图在数据帧中过滤掉具有特定日期(设置为多索引的第一级)的行。

过滤后,我想检查第一个级别的最后一个索引值是否与我的最新日期匹配。但是,我无法让Pandas返回正确的值。

示例可能会有所帮助。我首先使用multiindex创建原始df:

index = pd.date_range('2016-01-01', freq='B', periods=10), ["AAPL", "GOOG"]
df = pd.DataFrame(index=pd.MultiIndex.from_product(index))
print df

然后我过滤掉具体日期:

start, end = df.index.levels[0][1], df.index.levels[0][-4]
print start, end

现在,我创建了我的过滤后的df,仅包括从开始到结束的日期:

df2 = df.loc[start:end]
df2

这看起来很好,正如预期的那样。 &#34 01 /二千零十六分之一十二"是我的最后一个索引日期。

然后,当我检查第一级(0)的最后一个索引值时,它返回" 01/14/16"而不是我选择的结束日期(" 01/12 / 2016")。

print df2.index.levels[0][-1]

如何从df2获取最后一个日期? 我错过了什么或者这是一个错误吗?

2 个答案:

答案 0 :(得分:2)

您看到的行为的原因是切片pandas.DataFrame不会对索引进行切片,这是故意的。要获得所需的行为,可以使用Pandas 0.20.0中新引入的remove_unused_levels()函数:

# Update index to remove values that are not used
df2.index = df2.index.remove_unused_levels()

执行此操作后,以下两行将提供相同的输出:

# Print the last value in index
print df2.index.levels[0][-1]
# Print the last value in the slice
print end

为了解释一下,df2.index.levels[0]为您提供了实际使用的不同索引值。正如IanS所指出的,如果你想要实际使用的索引部分(而不是不同的值),那么你可以使用df2.index.get_level_values(0)。在上面的例子中,这将给每个日期两次,因为每个日期都用于'AAPL'和'GOOG'。取其中任何一个的最终值(通过-1)给出相同的值。

答案 1 :(得分:0)

看看df2.index,这不是你的想法。它包含重建多索引所需的信息,全部。

如果要访问索引值,请使用get_level_values

df2.index.get_level_values(0)

然后df2.index.get_level_values(0)[-1]应该返回您的预期。