web-dev-qa-db-ja.com

Python Pandas:マルチレベルの列インデックスから列をドロップしますか?

次のようなマルチレベルの列テーブルがあります。

    a
   ---+---+---
    b | c | f
--+---+---+---
0 | 1 | 2 | 7
1 | 3 | 4 | 9

列「c」を名前でドロップするにはどうすればよいですか?このように見えるように:

    a
   ---+---
    b | f
--+---+---
0 | 1 | 7
1 | 3 | 9

私はこれを試しました:

del df['c']

しかし、私は次のエラーを受け取ります、それは理にかなっています:

KeyError: 'キーの長さ(1)がMultiIndex lexsortの深さ(0)を超えていました'

20
Boosted_d16

解決済み:

df.drop('c', axis=1, level=1)
16
Boosted_d16

マルチインデックスでは、特定の列を削除するためにタプルを使用して列を指定するか、そのインデックスレベルでそのキーを持つすべての列を削除するレベルを指定する必要があります。

以下に示すように、drop column 'c' say drop ( 'a'、 'c')と言う代わりに:

df.drop(('a', 'c'), axis = 1, inplace = True)

または、以下に示すようにレベルを指定します

df.drop('c', axis = 1, level = 1)

簡単なdfを作ってみましょう。

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c"),
...                                   ("a", "f"), ('x', 'c'),('x', 'f')])
>>> df = pd.DataFrame([[1,3, 7, 21, 8], [2, 4, 9, 21, 8]], columns=cols)
>>> df
   a         x   
   b  c  f   c  f
0  1  3  7  21  8
1  2  4  9  21  8

ここで、「a」から「c」を削除する方法を説明します

>>> df.drop(('a', 'c'), axis = 1)
   a      x   
   b  f   c  f
0  1  7  21  8
1  2  9  21  8

3レベルのインデックスでは、そのキーをタプルに含めて、最下位レベルからドロップします。 ( 'a'、 'c'、 'k')

あなたがしたように、インデックスとして単一の値を使用すると、デフォルトで最上位のインデックスで一致するものを検索し、そのインデックスで一致したものを削除するか、見つかったようにキーがインデックスにない場合はエラーをスローします。

したがって、私の例では、「x」だけをドロップするように指示しても問題ありません。

>>> df.drop('x', axis = 1)
   a      
   b  c  f
0  1  3  7
1  2  4  9

2番目のインデックス「c」のすべての列を削除するには、レベルを指定します

>>> df.drop('c', axis = 1, level = 1)
   a     x
   b  f  f
0  1  7  8
1  2  9  8
7
Mint