Pandas IndexSlice以pd.style失败

时间:2016-12-08 23:17:14

标签: 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

我尝试使用pd.style格式化数据帧的输出。一个关键字是subset,您可以在其中定义应用格式规则的位置(例如:突出显示最大值)。 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

但是当传递给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'>

然而,如果我略微区别地传递它,它可以工作:

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

df.style.bar works as expected

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

有人可以解释什么是错的吗?

1 个答案:

答案 0 :(得分:4)

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

  

元组被视为(row_indexer,column_indexer)

这不是我们第一片获得的结果:

In [1]: pd.IndexSlice[1:-1,:-1]
Out[2]: (slice(1, -1, None), slice(None, -1, None))

但我们从第二个切片方法中得到了某种形式:

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

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

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