鉴于此数据框:
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')
我很困惑为什么这不起作用。似乎有一些关于pd.IndexSlice
的文档缺乏,所以也许我错过了一些东西。它也可能是pd.style
中的错误(这是一个相当新的错误,仅限0.17.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')