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

3
在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

现在,我创建了一个筛选后的数据框,只包括从开始到结束的日期:
df2 = df.loc[start:end]
df2

这看起来很好,和预期一样。"01/12/2016"是我的最后索引日期。

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

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

我该如何从df2中获取最后日期?我是不是漏了什么,还是这是一个bug?
2个回答

3
你所看到的行为是由于切片pandas.DataFrame时不会切片索引,这是有意的。要获得所需的行为,可以使用remove_unused_levels()函数,在Pandas 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)进行获取,将得到相同的值。

1

看一下df2.index,它并不是你想象中的那样。它包含了重构多级索引所需的信息,仅此而已。

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

df2.index.get_level_values(0)

那么 df2.index.get_level_values(0)[-1] 应该返回您所期望的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接