1. ホーム
  2. python

[解決済み】DataFrame.locで「Too many indexers」。

2022-02-20 06:07:42

質問

私が読んだのは スライサーに関するドキュメント を何度も使っているのですが、いまいち理解できていません。 loc をスライスする。 DataFrame を使って 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

を選択するだけです。 {コード と {コード の値なら、できる。

A0

また、3つのレベルから選択することもできますし、タプルでも有効です。

C1

ここまで、直感的で見事。

では、なぜ最初のインデックスレベルからすべての値を選択することができないのでしょうか?

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

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

Pandasはインデックスが似ていたり、似たような値を含んでいたりすると、時々混乱します。もし'C1'などという名前のカラムがあった場合、このスタイルのスライス/セレクトの下でもこれを行う必要があります。