Python多重索引:IndexSlice的用法

  • Post author:
  • Post category:python


笔者最近学习< Machine Learning for Algorithmic Trading >的时候遇到了如下代码,不太了解其中意思,经过学习领悟些许,写此篇以作记录,鉴于本人水平有限,不足之处欢迎批评指正:

idx = pd.IndexSlice
df = df.loc[idx[:, start: end], :] 
# start and end don't mean anything special

经了解,IndexSlice适用于多重索引情况下的切片操作,接下来举例说明,例子参考StackOverflow,链接在文末。

index1 = range(0,5)
index2 = list('abc')
index3 = ['I', 'II', 'III', 'IV']
index0 = pd.MultiIndex.from_product([index1, index2,index3])
df = pd.DataFrame(
    np.random.random([len(index0),2]), 
    index=index0, 
    columns=['col1', 'col2'])
df.head(12)

结果如下,可以看到比较清楚的多层索引结构:

在这里插入图片描述

在单索引条件下我们一般使用loc或iloc来且进行切片操作,然而如果在多重索引条件下则写法如下,

这是因为loc函数内不允许直接进行colons操作

df.loc[(slice(0, 3, None), slice('a', 'c', None)),[ 'col1']].head(12)
#这里如果'col1'不加[],结果就是series格式而非dataframe

#错误写法
df.loc[[0:3, 'a':'b'], ['col1']] 

在这里插入图片描述

而使用IndexSlice则使表达更加高效和易于理解:

idx = pd.IndexSlice
df.loc[idx[0:3, 'a':'b'],[ 'col1']] 
#可以得到与上式相同的结果

总结:IndexSlice其实就是为了方便多重索引进行的操作,可以较为方便的划定范围。

df.loc[idx[0:3, 'a':'c', 'I':'II'], ['col1']].head(12)

在这里插入图片描述


IndexSlice讲解(StackOverflow)



版权声明:本文为weixin_47911946原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。