2017-01-09 55 views
2

在Pandas中,我试图在数据框中过滤出具有特定日期(设置为多索引的第一级)的行。pandas - 多索引片不按预期调整索引值

一旦过滤,我想检查第一个级别的最后一个索引值是否与我最近的日期匹配。但是,我不能让熊猫得到正确的价值。

一个例子可能会有所帮助。我先用多指标创建原始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 

看起来很好,正如预期的那样。 “01/12/2016”是我最后的索引日期。

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

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

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

回答

0

看看df2.index,这不是你的想法。它包含重建多指标所需的信息,就这些。

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

df2.index.get_level_values(0) 

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

1

您看到的行为的原因是切片pandas.DataFrame不切片索引,这是故意的。为了得到你想要的行为,你可以使用remove_unused_levels()函数,在熊猫0.20.0最新推出:

# 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)给出相同的值。