Pandas IndexSlice 因 pd.style 失败

Jul*_*rec 6 python pandas

鉴于此数据框:

In [1]: df = pd.DataFrame(np.random.rand(4,4),
                          index=['A','B','C','All'],
                          columns=[2011,2012,2013,'All']).round(2)
        print(df)
Out[1]:

     2011  2012  2013   All
A    0.94  0.17  0.06  0.64
B    0.49  0.16  0.43  0.64
C    0.16  0.20  0.22  0.37
All  0.94  0.04  0.72  0.18
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用pd.style来格式化数据帧的输出。一个关键字是subset您定义在哪里应用格式规则(例如:highlight max)。pd.style的文档提示最好为此使用pd.IndexSlice

传递给的值的subset行为类似于切片 DataFrame。

  • 标量被视为列标签
  • 列表(或系列或 numpy 数组)
  • 元组被视为 (row_indexer, column_indexer)

考虑使用pd.IndexSlice为最后一个构造元组。

我试图理解为什么它在某些情况下会失败。

假设我想将条形应用于除第一行和最后一行之外的所有行以及除最后一行之外的所有列。

IndexSlice有效:

In [2]: df.ix[pd.IndexSlice[1:-1,:-1]]
Out[2]:
   2011  2012  2013
B  0.49  0.16  0.43
C  0.16  0.20  0.22
Run Code Online (Sandbox Code Playgroud)

但是当传递给 时style.bar,它不会:

In [3]: df.style.bar(subset=pd.IndexSlice[1:-1,:-1], color='#d65f5f')

TypeError: cannot do slice indexing on <class 'pandas.indexes.base.Index'>
with these indexers [1] of <class 'int'>
Run Code Online (Sandbox Code Playgroud)

然而,如果我通过稍微不同的方式传递它,它会起作用:

In [4]: df.style.bar(subset=pd.IndexSlice[df.index[1:-1],df.columns[:-1]],
                     color='#d65f5f')
Run Code Online (Sandbox Code Playgroud)

df.style.bar 按预期工作

我很困惑为什么这不起作用。似乎有点缺乏有关的文档,pd.IndexSlice所以也许我遗漏了一些东西。它也可能是一个错误pd.style(这是相当新的,因为0.17.1只有)。

有人可以解释一下有什么问题吗?

Ale*_*exG 6

存在这个兼容性问题太糟糕了。不过,据我所知,您可以回答自己的问题。从您的文档中,您包含了以下行:

元组被视为 (row_indexer, column_indexer)

这不是我们用第一个切片得到的:

In [1]: pd.IndexSlice[1:-1,:-1]
Out[2]: (slice(1, -1, None), slice(None, -1, None))
Run Code Online (Sandbox Code Playgroud)

但是我们确实从第二个 slice 方法中得到了这种形式的东西:

In [3]: pd.IndexSlice[df.index[1:-1],df.columns[:-1]]
Out[4]: (Index(['B', 'C'], dtype='object'), Index([2011, 2012, 2013], dtype='object'))
Run Code Online (Sandbox Code Playgroud)

pd.IndexSlice对于第二种情况,我认为除了将内容包装在元组中之外,甚至不会做任何事情。你可以这样做:

df.style.bar(subset=(df.index[1:-1],df.columns[:-1]),
                     color='#d65f5f')
Run Code Online (Sandbox Code Playgroud)