当前位置: 首页 > 面试题库 >

DataFrame.loc的“索引器过多”

卫景明
2023-03-14
问题内容

我已经阅读了有关切片器的文档一百万次,但是却从未想过,所以我仍在尝试找出如何使用loc切片器DataFramea MultiIndex

DataFrame将从这个SO答案开始:

                           value
first second third fourth       
A0    B0     C1    D0          2
                   D1          3
             C2    D0          6
                   D1          7
      B1     C1    D0         10
                   D1         11
             C2    D0         14
                   D1         15
A1    B0     C1    D0         18
                   D1         19
             C2    D0         22
                   D1         23
      B1     C1    D0         26
                   D1         27
             C2    D0         30
                   D1         31
A2    B0     C1    D0         34
                   D1         35
             C2    D0         38
                   D1         39
      B1     C1    D0         42
                   D1         43
             C2    D0         46
                   D1         47
A3    B0     C1    D0         50
                   D1         51
             C2    D0         54
                   D1         55
      B1     C1    D0         58
                   D1         59
             C2    D0         62
                   D1         63

要选择公正A0C1价值观,我可以这样做:

In [26]: df.loc['A0', :, 'C1', :]
Out[26]: 
                           value
first second third fourth       
A0    B0     C1    D0          2
                   D1          3
      B1     C1    D0         10
                   D1         11

它也可以从三个级别(甚至是元组)中进行选择:

In [28]: df.loc['A0', :, ('C1', 'C2'), 'D1']
Out[28]: 
                           value
first second third fourth       
A0    B0     C1    D1          3
             C2    D1          5
      B1     C1    D1         11
             C2    D1         13

到目前为止,直观而辉煌。

那为什么不能从第一个索引级别选择所有值?

In [30]: df.loc[:, :, 'C1', :]
---------------------------------------------------------------------------
IndexingError                             Traceback (most recent call last)
<ipython-input-30-57b56108d941> in <module>()
----> 1 df.loc[:, :, 'C1', :]

/usr/local/lib/python2.7/dist-packages/pandas/core/indexing.pyc in __getitem__(self, key)
   1176     def __getitem__(self, key):
   1177         if type(key) is tuple:
-> 1178             return self._getitem_tuple(key)
   1179         else:
   1180             return self._getitem_axis(key, axis=0)

/usr/local/lib/python2.7/dist-packages/pandas/core/indexing.pyc in _getitem_tuple(self, tup)
    694 
    695         # no multi-index, so validate all of the indexers
--> 696         self._has_valid_tuple(tup)
    697 
    698         # ugly hack for GH #836

/usr/local/lib/python2.7/dist-packages/pandas/core/indexing.pyc in _has_valid_tuple(self, key)
    125         for i, k in enumerate(key):
    126             if i >= self.obj.ndim:
--> 127                 raise IndexingError('Too many indexers')
    128             if not self._has_valid_type(k, i):
    129                 raise ValueError("Location based indexing can only have [%s] "

IndexingError: Too many indexers

当然这不是预期的行为吗?

注意:我知道这是可能的,df.xs('C1', level='third')但是当前.loc行为似乎不一致。


问题答案:

这不起作用的原因与指定索引轴有关(在http://pandas.pydata.org/pandas-
docs/stable/advanced.html
提到)。您问题的另一种解决方案是简单地执行此操作:

df.loc(axis=0)[:, :, 'C1', :]

当索引相似或包含相似值时,熊猫有时会感到困惑。如果要使用名为“ C1”的列或其他名称,则还需要使用这种切片/选择样式。



 类似资料:
  • 问题内容: 我正在寻找一种简洁的方法来过滤特定索引处的列表中的项目。我的示例输入如下所示: 我想在指标筛选出的项目,,,。我有一个for循环,它跳过与索引匹配的项目,但我希望可以有一种使用流的简单方法。最终结果将如下所示: 问题答案: 您可以生成一个模拟原始列表的索引,然后删除列表中的索引,然后将这些索引映射到列表中的相应元素(一种更好的方法是使用for索引,因为它们是唯一的定义,以便进行恒定时间

  • 主要内容:定义索引器,索引器重载索引器(英文名:Indexer)是类中的一个特殊成员,它能够让对象以类似数组的形式来操作,使程序看起来更为直观,更容易编写。索引器与 属性类似,在定义索引器时同样会用到 get 和 set 访问器,不同的是,访问属性不需要提供参数而访问索引器则需要提供相应的参数。 定义索引器 C# 中属性的定义需要提供属性名称,而索引器则不需要具体名称,而是使用 this 关键字来定义,语法格式如下: 索引器类型

  • indexer允许对象进行索引,例如数组。 为类定义索引器时,此类的行为类似于virtual array 。 然后,您可以使用数组访问运算符([])访问此类的实例。 语法 (Syntax) 一维索引器具有以下语法 - element-type this[int index] { // The get accessor. get { // return the value s

  • 索引过程是Lucene提供的核心功能之一。 下图说明了索引过程和类的使用。 IndexWriter是索引过程中最重要和最核心的组件。 我们将包含Field(s) Document(s)添加到IndexWriter,它使用Analyzer分析Document,然后根据需要creates/open/edit索引,并在Directory存储/更新它们。 IndexWriter用于更新或创建索引。 它不用

  • 我想要一个Elasticsearch索引,它只存储功能的“名称”。我希望能够发出语音查询,也可以单独键入前置式查询。我想我可以用两个分析器和两个过滤器创建一个索引;每个分析仪可以使用其中一个过滤器。但我似乎无法做到这一点。 以下是我尝试使用的索引设置json: 当我尝试使用这些设置创建索引时: 我得到一个HTTP 400,说 别误会,我完全明白这句话的意思。我看了又看,寻找一个错误的逗号或引号,但

  • 问题内容: 假设此JSON对象: 可以像这样检索“ set2”属性: 有没有一种方法可以通过索引检索“ set2”属性?它是JSON对象的第二个属性。这是行不通的(当然): 因此,假设我要检索JSON对象的第二个属性,但我不知道它的名称-那么我该怎么做? 更新: 是的,我知道对象是无序属性的集合。但是我不认为浏览器会干扰JSON文字/字符串定义的“原始”顺序。 问题答案: JavaScript中的