pandas - 多索引切片未按预期调整索引值
pandas - slice of multiindex not adjusting index values as expected
在 Pandas 中,我试图过滤掉数据框中具有特定日期(设置为多索引的第一级)的行。
过滤后,我想检查第一级的最后一个索引值是否与我的最新日期匹配。但是,我无法获得 Pandas 到 return 的正确值。
举个例子可能会有帮助。我首先使用 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
这看起来不错,符合预期。 “01/12/2016”是我的最后索引日期。
然后,当我检查第一级 (0) 的最后一个索引值时,它 return 是“01/14/16”而不是我选择的结束日期(“01/12/2016”) .
print df2.index.levels[0][-1]
如何从 df2 获取最后日期?
我是不是遗漏了什么或者这是一个错误?
看看df2.index
,不是你想的那样。它包含重建多索引所需的信息,仅此而已。
如果要访问索引值,请使用 get_level_values
:
df2.index.get_level_values(0)
那么 df2.index.get_level_values(0)[-1]
应该 return 您所期望的。
您看到的行为的原因是切片 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)给出相同的值。
在 Pandas 中,我试图过滤掉数据框中具有特定日期(设置为多索引的第一级)的行。
过滤后,我想检查第一级的最后一个索引值是否与我的最新日期匹配。但是,我无法获得 Pandas 到 return 的正确值。
举个例子可能会有帮助。我首先使用 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
这看起来不错,符合预期。 “01/12/2016”是我的最后索引日期。
然后,当我检查第一级 (0) 的最后一个索引值时,它 return 是“01/14/16”而不是我选择的结束日期(“01/12/2016”) .
print df2.index.levels[0][-1]
如何从 df2 获取最后日期? 我是不是遗漏了什么或者这是一个错误?
看看df2.index
,不是你想的那样。它包含重建多索引所需的信息,仅此而已。
如果要访问索引值,请使用 get_level_values
:
df2.index.get_level_values(0)
那么 df2.index.get_level_values(0)[-1]
应该 return 您所期望的。
您看到的行为的原因是切片 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)给出相同的值。