2017-01-09 60 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)給出相同的值。