鉴于此数据框:
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')
我很困惑为什么这不起作用.似乎有一些关于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')