次のようなマルチレベルの列テーブルがあります。
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)を超えていました'
解決済み:
df.drop('c', axis=1, level=1)
マルチインデックスでは、特定の列を削除するためにタプルを使用して列を指定するか、そのインデックスレベルでそのキーを持つすべての列を削除するレベルを指定する必要があります。
以下に示すように、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