こんにちは、今回はdrop関数に関して詳しくまとめていきたいと思います。
DataFrameの整形で非常に役に立つ関数なのでぜひ使い来ないしたいですね。
特に、dropを使ったのに削除できなかったときの対処法も書いています。
行・列の削除に使える関数
pop、del、dropの3つの基本的な使い方は以下の記事でまとめています。
こんにちは、今回はpandasのDataFrameで行や列を削除する方法を解説していきます。 それぞれの役割やメリットを確認しながら基本的なポイントを押さえていきましょう。 [itemlink post_id="4429"] […]
今回はdrop関数についてみていきましょう。
以下では次のDataFrameに対して処理を行っていきます。
このコードはGoogle Colaboratoryやjupyter notebook、jupyter lab上で実行できます。
1 2 3 4 5 6 7 8 9 10 |
import pandas as pd df = pd.DataFrame( data={'col1': [10, 20, 30, 40], 'col2': [50, 60, 70, 80], 'col3': ['a', 'b', 'c', 'd']}, index=['row1', 'row2', 'row3', 'row4'] ) df |
drop関数の引数
labels、axis、index、columnsの使い方は以下の記事でまとめているので、
今回は簡単に紹介するにとどめます。
こんにちは、今回はpandasのDataFrameで行や列を削除する方法を解説していきます。 それぞれの役割やメリットを確認しながら基本的なポイントを押さえていきましょう。 [itemlink post_id="4429"] […]
drop関数の基本的な使い方
列の削除
列を削除するにはcolumnsに列名を渡すか、axis(軸)に1を渡します。
また、複数列を削除するならリストを使いましょう。
以下のコードは列col1を削除する方法を2通りで書いています。
1 2 3 4 5 |
#①columnsを指定する方法 df.drop(columns='col1') #②軸(axis)を指定する方法 df.drop('col1', axis=1) |
行の削除
行を削除するにはindexに行名を渡すか、axis(軸)に0を渡します。
複数行を削除するならリストを使いましょう。
以下のコードはrow1、row2を削除する方法を3通りで書いています。
1 2 3 4 5 6 7 8 |
#①indexを指定する df.drop(index=['row1', 'row2']) #②軸(axis)を指定する df.drop(['row1', 'row2'], axis=0) #③行はaxisを省略可能 df.drop(['row1', 'row2']) |
inplaceの役割と消えない理由・対策
inplace=False(デフォルト)のとき
このとき元のDataFrameは変更されずに、行や列を削除したコピーのDataFrameが返されます。
以下のように列col1を削除後にdfを表示させると、変更前のDataFrameが表示されます。
1 2 |
df.drop('col1', axis=1) df #もとのdfが表示される |
このように、せっかく行や列を削除してもその変更が維持されなければ意味がないですよね。
こういった戻り値のことを知らないと、「行や列が消えない!」なんてことになって変なところで足止めを食らう可能性もあります。そこで2つの対策方法を紹介します。
対策①新たな変数に代入する
もとのDataFrameはそのまま残しておきたいときは、
次のように新たな変数に代入してあげた方がいいですね。
1 2 |
df_d = df.drop('col1', axis=1) df_d |
対策②inplace=Trueに変更
もとのDataFrameを残しておく必要がないときは、
「inplace=True
」に変更することで解決します。
1 2 |
df.drop('col1', axis=1, inplace=True) df #削除されたdfが表示される |
levelの使い方
マルチインデックス(MultiIndex)のDataFrameを削除するときに使えます。
マルチインデックスとは以下のような構造のDataFrameのことです。
1 2 3 4 5 6 7 8 9 |
midx = pd.MultiIndex(levels=[['Mult1', 'Mult2', 'Mult3'], ['row1', 'row2', 'row3']], codes=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]]) df = pd.DataFrame(index=midx, data={'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9], 'col2': [10, 20, 30, 40, 50, 60, 70, 80, 90], 'col3': [11, 22, 33, 44, 55, 66, 77, 88, 99]}) df |
indexを2段階で設定しているイメージですね。
詳しい書き方などは別記事で解説したいと思います。
これに対してdropを使うと以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 |
#①外側のindexを削除 df_mul.drop(index='Mul2') #②内側のindexを削除するにはlevel=1にする df_mul.drop(index='row1', level=1) #③levelがないとエラー df_mul.drop(index='row1') #③の出力結果 KeyError: 'row1' |
外側のindexを指定するときにlevelは必要ありませんが、
内側のindexを削除するときには必要です。
errorsの使い方
- errors=’raise’(デフォルト)
- 存在しない行名・列名を渡すとエラーになる。
- errors=’ignore’
- 存在しない行名・列名はスルーしてくれる。
1 2 3 4 5 |
#row5は存在しない df.drop(index=['row1', 'row2', 'row5']) #出力結果 KeyError: "['row5'] not found in axis" |
1 2 |
#row5はスルーしてくれる df.drop(index=['row1', 'row2', 'row5'], errors='ignore') |
必要のないエラーをカットできるので便利ですが、本当は削除したいのにスペルミスで入力してしまったときもスルーされてしまうので乱用は避けたいですね。人間が入力するときではなく、プログラムからプログラムに渡すときに使用することをおススメします。
まとめ
いかがでしたか。今回はdropについて詳しくまとめていきました。
たくさん引数がありますが、それぞれの役割を分かって使うととっても便利になりますね。