微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas IndexSlice失败了pd.style

鉴于此数据框:

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来格式化数据帧的输出.一个关键字是您定义应用格式规则的位置的子集(例如:突出显示最大值). pd.style的文档暗示最好使用pd.IndexSlice:

The value passed to subset behaves simlar to slicing a DataFrame.

  • A scalar is treated as a column label
  • A list (or series or numpy array)
  • A tuple is treated as (row_indexer, column_indexer)

Consider using pd.IndexSlice to construct the tuple for the last one.

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

假设我想对所有行应用一个条形,但是第一个和最后一个,所有列都是最后一个.

这个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).

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

解决方法:

存在兼容性问题太糟糕了.据我所知,你回答了自己的问题.从你的文档中你包括以下内容

A tuple is treated as (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')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐