笔者最近学习< 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)