python - 使用 MultiIndex 切片时出现 KeyError

标签 python python-3.x pandas dataframe

虽然我能够解决这个问题,但我想了解为什么会发生这个错误。 数据框

import pandas as pd
import itertools

sl_df=pd.DataFrame(
    data=list(range(18)), 
    index=pd.MultiIndex.from_tuples(
        list(itertools.product(
            ['A','B','C'],
            ['I','II','III'],
            ['x','y']))),
    columns=['one'])

输出:

         one
A I   x    0
      y    1
  II  x    2
      y    3
  III x    4
      y    5
B I   x    6
      y    7
  II  x    8
      y    9
  III x   10
      y   11
C I   x   12
      y   13
  II  x   14
      y   15
  III x   16
      y   17

有效的简单切片

sl_df.loc[pd.IndexSlice['A',:,'x']]

输出:

         one
A I   x    0
  II  x    2
  III x    4

抛出错误的部分:

sl_df.loc[pd.IndexSlice[:,'II']]

输出:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-6-4bfd2d65fd21> in <module>()
----> 1 sl_df.loc[pd.IndexSlice[:,'II']]

...\pandas\core\indexing.pyc in __getitem__(self, key)
   1470             except (KeyError, IndexError):
   1471                 pass
-> 1472             return self._getitem_tuple(key)
   1473         else:
   1474             # we by definition only have the 0th axis

...\pandas\core\indexing.pyc in _getitem_tuple(self, tup)
    868     def _getitem_tuple(self, tup):
    869         try:
--> 870             return self._getitem_lowerdim(tup)
    871         except IndexingError:
    872             pass

...\pandas\core\indexing.pyc in _getitem_lowerdim(self, tup)
    977         # we may have a nested tuples indexer here
    978         if self._is_nested_tuple_indexer(tup):
--> 979             return self._getitem_nested_tuple(tup)
    980
    981         # we maybe be using a tuple to represent multiple dimensions here

...\pandas\core\indexing.pyc in _getitem_nested_tuple(self, tup)
   1056
   1057             current_ndim = obj.ndim
-> 1058             obj = getattr(obj, self.name)._getitem_axis(key, axis=axis)
   1059             axis += 1
   1060

...\pandas\core\indexing.pyc in _getitem_axis(self, key, axis)
   1909
   1910         # fall thru to straight lookup
-> 1911         self._validate_key(key, axis)
   1912         return self._get_label(key, axis=axis)
   1913

...\pandas\core\indexing.pyc in _validate_key(self, key, axis)
   1796                 raise
   1797             except:
-> 1798                 error()
   1799
   1800     def _is_scalar_access(self, key):

...\pandas\core\indexing.pyc in error()
   1783                 raise KeyError(u"the label [{key}] is not in the [{axis}]"
   1784                                .format(key=key,
-> 1785                                        axis=self.obj._get_axis_name(axis)))
   1786
   1787             try:

KeyError: u'the label [II] is not in the [columns]'

解决方法:(或者当索引的第一级上有“:”时的正确方法。)

sl_df.loc[pd.IndexSlice[:,'II'],:]

输出:

        one
A II x    2
     y    3
B II x    8
     y    9
C II x   14
     y   15

问题:为什么只有当我们在 MultiIndex 的第一层使用“:”时才必须在轴 1 上指定“:”?您是否同意它在其他级别上工作但在 MultiIndex 的第一级别上不起作用(请参阅上面的简单切片)有点奇怪?

最佳答案

从 pandas 文档的当前版本来看,使用切片器进行索引似乎需要在 .loc 方法中指定两个轴。

See first warning here

基本原理是,如果不指定两个轴,则沿哪个轴选择完成可能会不明确。

我不明白 pandas 的内部结构是如何工作的,但是在您的具体情况下,当您编写 sl_df.loc[pd.IndexSlice[:,'II']] 时,它看起来像 >: 被分派(dispatch)到行轴(即选择所有行),'II' 分派(dispatch)到列,因此错误:KeyError: u'the label [II] is不在[列]'中。

关于python - 使用 MultiIndex 切片时出现 KeyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53872956/

相关文章:

Python OpenGL 不会渲染四边形中的每个三角形

python - DataFrame 挑战 : mapping ID to value in different row. 最好使用 Polars

python - 带有 Multiindex 的 Pandas 点积

python - 按行将列名从 DataFrame 提取到 Series 中

python - 根据某些条件从模型中过滤数据

python - 为什么 Scrapy 的字段是字典?

python - python中两个数组(不同大小)之间可能的唯一组合?

Python 发送已知字节

python - Scikit-image:无法导入名称 'label'

python - 如何使 random.choices 真正随机(我在 secrets 模块中找不到它)