【Pandas】`drop column`の使い方をマスター!列削除の基本

はい、承知いたしました。Pandasのdropメソッドを使った列削除に焦点を当て、約5000語の詳細な解説記事を作成します。


Pandas drop column の使い方をマスター!列削除の基本から応用まで

データ分析の世界において、Pandasは欠かせないツールです。表形式データを扱う上で非常に強力で柔軟な機能を提供します。しかし、実際のデータは常に分析に適した形で提供されるわけではありません。多くの場合、分析の前にデータのクリーニングや整形といった前処理が必要になります。

前処理の一つとして非常に頻繁に行われるのが、「不要な列を削除する」という操作です。データセットに分析に関係のない列や、欠損値が多すぎる列、あるいは機密情報を含む列などが含まれている場合、それらを削除することでデータセットをシンプルにし、分析の効率や精度を向上させることができます。

Pandasにおいて、この列削除の主要な手段となるのが、DataFrameオブジェクトの持つdropメソッドです。dropメソッドは、指定したラベル(行名または列名)に対応する行や列を削除するために使用されます。本記事では、特に「列の削除」に焦点を当て、dropメソッドの基本的な使い方から、様々な状況に応じた応用的な使い方、さらには知っておくべき注意点や他の方法との比較まで、網羅的に解説していきます。

この記事を読めば、Pandasを使ったデータ前処理において、自信を持って不要な列を削除できるようになるでしょう。

1. はじめに:データ前処理における列削除の重要性

データ分析プロジェクトでは、最初のステップとしてデータの収集と読み込みが行われます。しかし、元のデータは分析の目的とは関係のない情報を含んでいたり、ノイズとなるようなデータが含まれていたりすることがよくあります。

例えば、顧客データには、分析に不要な内部ID、あるいは個人情報保護の観点から分析者には公開すべきではないメールアドレスや電話番号などが含まれているかもしれません。また、センサーデータでは、一部のセンサーが故障しており、特定の列のデータがほとんど欠損しているといった状況も考えられます。

このような場合、不要な列をそのまま残しておくと、以下のような問題が発生する可能性があります。

  • メモリの無駄遣い: 大量の不要な列があると、DataFrameが占めるメモリサイズが増大し、大規模なデータセットを扱う際にシステムリソースを圧迫する可能性があります。
  • 処理速度の低下: 不要な列が存在すると、ソート、フィルタリング、集計などの操作を行う際に、それらの列も一緒に処理されるため、計算時間が長くなることがあります。
  • 分析の複雑化: 不要な列が混在していると、目的の列を見つけにくくなったり、分析のコードが煩雑になったりして、作業効率が低下します。
  • プライバシーやセキュリティのリスク: 機密情報を含む列を誤って共有したり公開したりするリスクが高まります。
  • モデル性能の低下: 機械学習モデルの学習において、無関係な列やノイズの多い列はモデルの学習を妨げ、性能を低下させる原因となることがあります(次元の呪い)。

したがって、分析の目的を明確にし、それに関連性の低い、あるいは有害となりうる列を特定し、適切に削除することは、効率的かつ正確なデータ分析を行う上で非常に重要な前処理ステップと言えます。

Pandasのdropメソッドは、この列削除タスクを実行するための主要かつ非常に便利な機能です。

2. Pandas DataFrameとSeriesの基本(drop理解のために)

dropメソッドはDataFrame(またはSeries)のメソッドです。dropを使った列削除のメカニズムを理解するために、PandasのDataFrameとSeriesの基本構造を簡単に振り返っておきましょう。

  • Series: PandasのSeriesは、一次元ラベル付き配列です。各要素にはインデックス(ラベル)が関連付けられています。PythonのリストやNumPyの一次元配列に似ていますが、インデックスを持つ点が異なります。
  • DataFrame: PandasのDataFrameは、二次元ラベル付きデータ構造です。これは、複数のSeriesが同じインデックスを共有して集まったものと考えることができます。DataFrameは行と列を持ち、それぞれの軸にラベル(インデックスと列名)が付けられています。スプレッドシートやリレーショナルデータベースのテーブルに似ています。

dropメソッドは、このDataFrameやSeriesから、指定したラベル(行のインデックス名または列名)に対応するデータを取り除くために使われます。削除は「軸」を指定して行います。

  • 軸0 (axis=0): 行(インデックス)方向。指定したラベルに対応する行を削除します。
  • 軸1 (axis=1): 列方向。指定したラベルに対応する列を削除します。

この記事では、主に列削除(axis=1)に焦点を当てます。

3. dropメソッドの基本:列を削除する

さて、いよいよdropメソッドを使った列削除の具体的な方法を見ていきましょう。まずは最も基本的な使い方から始めます。

dropメソッドのシグネチャ(主要な引数)は以下のようになっています。

python
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')

引数はたくさんありますが、列削除で主に使うのは以下の引数です。

  • labels: 削除したいラベル(行のインデックス名または列名)を指定します。単一のラベル、またはラベルのリストを指定できます。
  • axis: 削除を行う軸を指定します。0または'index'で行を削除、1または'columns'で列を削除します。デフォルトは0(行削除)です。
  • columns: 列を削除する場合に、labelsaxis=1の組み合わせの代わりに使えます。こちらの方が列削除であることが明確なので推奨されます。削除したい列名を単一の文字列、または文字列のリストで指定します。
  • inplace: bool型。デフォルトはFalseです。Falseの場合、dropメソッドは元のDataFrameを変更せずに、削除した新しいDataFrameを返します。Trueの場合、元のDataFrame自体が変更され、メソッドはNoneを返します。
  • errors: 'raise'または'ignore'。デフォルトは'raise'です。削除対象として指定したラベルが存在しない場合に、エラーを発生させるか ('raise')、無視して処理を続行するか ('ignore') を指定します。

これらの引数を使って、具体的に列を削除する方法を見ていきましょう。まずサンプルデータを作成します。

“`python
import pandas as pd
import numpy as np

サンプルDataFrameの作成

data = {
‘ID’: range(101, 111),
‘名前’: [f’ユーザー{i}’ for i in range(10)],
‘年齢’: [25, 30, np.nan, 35, 40, 45, 50, 55, 60, 65],
‘居住地’: [‘東京’, ‘大阪’, ‘東京’, ‘名古屋’, ‘福岡’, ‘大阪’, ‘東京’, ‘札幌’, ‘仙台’, ‘広島’],
‘登録日’: pd.to_datetime([‘2023-01-15’, ‘2023-02-20’, ‘2023-03-10’, ‘2023-04-05’, ‘2023-05-25’, ‘2023-06-18’, ‘2023-07-01’, ‘2023-08-14’, ‘2023-09-29’, ‘2023-10-11’]),
‘最終ログイン’: pd.to_datetime([‘2024-01-10’, ‘2024-01-12’, ‘2023-12-01’, ‘2024-01-11’, ‘2024-01-05’, ‘2024-01-08’, ‘2024-01-09’, ‘2023-11-20’, ‘2024-01-03’, ‘2024-01-07’]),
‘不要な列1’: np.random.rand(10), # 分析に不要と仮定
‘不要な列2′: [f’その他情報{i}’ for i in range(10)], # 分析に不要と仮定
}
df = pd.DataFrame(data)
print(“元のDataFrame:”)
print(df)
print(“\n” + “=”*30 + “\n”)
“`

“`
元のDataFrame:
ID 名前 年齢 居住地 登録日 最終ログイン 不要な列1 不要な列2
0 101 ユーザー0 25.0 東京 2023-01-15 2024-01-10 0.563448 その他情報0
1 102 ユーザー1 30.0 大阪 2023-02-20 2024-01-12 0.467671 その他情報1
2 103 ユーザー2 NaN 東京 2023-03-10 2023-12-01 0.840382 その他情報2
3 104 ユーザー3 35.0 名古屋 2023-04-05 2024-01-11 0.838918 その他情報3
4 105 ユーザー4 40.0 福岡 2023-05-25 2024-01-05 0.006949 その他情報4
5 106 ユーザー5 45.0 大阪 2023-06-18 2024-01-08 0.446550 その他情報5
6 107 ユーザー6 50.0 東京 2023-07-01 2024-01-09 0.862646 その他情報6
7 108 ユーザー7 55.0 札幌 2023-08-14 2023-11-20 0.454700 その他情報7
8 109 ユーザー8 60.0 仙台 2023-09-29 2024-01-03 0.751344 その他情報8
9 110 ユーザー9 65.0 広島 2023-10-11 2024-01-07 0.135569 その他情報9

==============================
“`

このDataFrameには、不要な列1不要な列2という、分析には使わないと想定される列が含まれています。これらを削除してみましょう。

3.1. 単一の列を削除する (columns引数を使用)

最も推奨される方法の一つです。columns引数に削除したい列名を文字列で指定します。

“`python

単一の列 ‘不要な列1’ を削除

df_dropped_single = df.drop(columns=’不要な列1′)

print(“「不要な列1」を削除したDataFrame:”)
print(df_dropped_single)
print(“\n” + “=”*30 + “\n”)
“`

“`
「不要な列1」を削除したDataFrame:
ID 名前 年齢 居住地 登録日 最終ログイン 不要な列2
0 101 ユーザー0 25.0 東京 2023-01-15 2024-01-10 その他情報0
1 102 ユーザー1 30.0 大阪 2023-02-20 2024-01-12 その他情報1
2 103 ユーザー2 NaN 東京 2023-03-10 2023-12-01 その他情報2
3 104 ユーザー3 35.0 名古屋 2023-04-05 2024-01-11 その他情報3
4 105 ユーザー4 40.0 福岡 2023-05-25 2024-01-05 その他情報4
5 106 ユーザー5 45.0 大阪 2023-06-18 2024-01-08 その他情報5
6 107 ユーザー6 50.0 東京 2023-07-01 2024-01-09 その他情報6
7 108 ユーザー7 55.0 札幌 2023-08-14 2023-11-20 その他情報7
8 109 ユーザー8 60.0 仙台 2023-09-29 2024-01-03 その他情報8
9 110 ユーザー9 65.0 広島 2023-10-11 2024-01-07 その他情報9

==============================
“`

このように、df.drop(columns='列名')を実行すると、指定した列が削除された新しいDataFrameが返されます。元のdfは変更されないことに注意してください(inplace=Falseがデフォルトのため)。

3.2. 複数の列を削除する (columns引数を使用)

複数の列を一度に削除したい場合は、columns引数に削除したい列名のリストを指定します。

“`python

複数の列 [‘不要な列1’, ‘不要な列2’] を削除

df_dropped_multiple = df.drop(columns=[‘不要な列1’, ‘不要な列2’])

print(“「不要な列1」と「不要な列2」を削除したDataFrame:”)
print(df_dropped_multiple)
print(“\n” + “=”*30 + “\n”)
“`

“`
「不要な列1」と「不要な列2」を削除したDataFrame:
ID 名前 年齢 居住地 登録日 最終ログイン
0 101 ユーザー0 25.0 東京 2023-01-15 2024-01-10
1 102 ユーザー1 30.0 大阪 2023-02-20 2024-01-12
2 103 ユーザー2 NaN 東京 2023-03-10 2023-12-01
3 104 ユーザー3 35.0 名古屋 2023-04-05 2024-01-11
4 105 ユーザー4 40.0 福岡 2023-05-25 2024-01-05
5 106 ユーザー5 45.0 大阪 2023-06-18 2024-01-08
6 107 ユーザー6 50.0 東京 2023-07-01 2024-01-09
7 108 ユーザー7 55.0 札幌 2023-08-14 2023-11-20
8 109 ユーザー8 60.0 仙台 2023-09-29 2024-01-03
9 110 ユーザー9 65.0 広島 2023-10-11 2024-01-07

==============================
“`

このように、削除したい列名をリストに入れてcolumns引数に渡すことで、複数の列をまとめて削除できます。

3.3. labelsaxis=1を使った方法 (古い書き方)

dropメソッドの本来の引数構成は、labelsaxisを使う形です。列削除の場合は、labelsに削除したい列名を指定し、axis1または'columns'を指定します。

“`python

単一の列 ‘不要な列1’ を削除 (labels+axis=1)

df_dropped_single_old = df.drop(labels=’不要な列1′, axis=1)

df_dropped_single_old = df.drop(‘不要な列1’, axis=1) # labelsは省略可

print(“「不要な列1」を削除したDataFrame (labels+axis=1):”)
print(df_dropped_single_old)
print(“\n” + “=”*30 + “\n”)

複数の列 [‘不要な列1’, ‘不要な列2’] を削除 (labels+axis=1)

df_dropped_multiple_old = df.drop(labels=[‘不要な列1’, ‘不要な列2’], axis=1)

df_dropped_multiple_old = df.drop([‘不要な列1’, ‘不要な列2’], axis=1) # labelsは省略可

print(“「不要な列1」と「不要な列2」を削除したDataFrame (labels+axis=1):”)
print(df_dropped_multiple_old)
print(“\n” + “=”*30 + “\n”)
“`

“`
「不要な列1」を削除したDataFrame (labels+axis=1):
ID 名前 年齢 居住地 登録日 最終ログイン 不要な列2
0 101 ユーザー0 25.0 東京 2023-01-15 2024-01-10 その他情報0
… (以下同様の出力)

==============================

「不要な列1」と「不要な列2」を削除したDataFrame (labels+axis=1):
ID 名前 年齢 居住地 登録日 最終ログイン
0 101 ユーザー0 25.0 東京 2023-01-15 2024-01-10
… (以下同様の出力)

==============================
“`

labelsaxis=1を使う方法でも同じ結果が得られます。しかし、columns引数を使う方が、「列を削除している」という意図がコードから明確に読み取れるため、可読性の観点から推奨されます。特に、labels引数はデフォルトで省略可能なので、df.drop('不要な列1', axis=1) のように書かれることもありますが、これだと第一引数が削除対象のラベルであること、axis=1が列削除を指定していることを理解していないと、コードの意味を把握しにくい場合があります。

今後コードを書く際は、特別な理由がない限りcolumns引数を使用することをお勧めします。

4. inplace=True vs inplace=False

dropメソッドの非常に重要な引数の一つにinplaceがあります。これは、削除操作を「元のDataFrameに対して直接行うか(True)」、それとも「変更を加えずに新しいDataFrameを生成して返すか(False)」を制御します。デフォルトはFalseです。

4.1. inplace=False (デフォルト)

inplace=Falseの場合、dropメソッドは削除操作を適用した新しいDataFrameを返します。元のDataFrameは一切変更されません。

“`python
print(“元のDataFrame (変更なし):”)
print(df) # drop(inplace=False)を実行してもdf自体は変わらない

新しい変数に結果を代入して利用する

df_modified = df.drop(columns=[‘不要な列1’, ‘不要な列2’])

print(“\n変更後のDataFrame (新しいオブジェクト):”)
print(df_modified)
print(“\n” + “=”*30 + “\n”)

print(“元のDataFrameはまだ変更されていないことを確認:”)
print(df)
print(“\n” + “=”*30 + “\n”)
“`

“`
元のDataFrame (変更なし):
ID 名前 年齢 居住地 登録日 最終ログイン 不要な列1 不要な列2
0 101 ユーザー0 25.0 東京 2023-01-15 2024-01-10 0.563448 その他情報0
… (以下同様の出力)

==============================

変更後のDataFrame (新しいオブジェクト):
ID 名前 年齢 居住地 登録日 最終ログイン
0 101 ユーザー0 25.0 東京 2023-01-15 2024-01-10
… (以下同様の出力)

==============================

元のDataFrameはまだ変更されていないことを確認:
ID 名前 年齢 居住地 登録日 最終ログイン 不要な列1 不要な列2
0 101 ユーザー0 25.0 東京 2023-01-15 2024-01-10
… (以下同様の出力)

==============================
“`

inplace=Falseの利点は以下の通りです。

  • 元のデータを保持: 元のデータセットを分析の途中で誤って変更してしまう心配がなく、いつでもオリジナルの状態に戻ったり、別の処理を試したりできます。
  • メソッドチェーンとの相性: 複数の操作を連続して行う際に、メソッドチェーンを使って簡潔に記述できます。例えば、df.drop(...).fillna(...).groupby(...)のように、前の操作の結果(新しいDataFrame)に対して次の操作を適用できます。
  • デバッグのしやすさ: 中間結果を別の変数に格納できるため、各ステップのDataFrameの状態を確認しながらデバッグを進めることができます。

4.2. inplace=True

inplace=Trueの場合、dropメソッドは元のDataFrame自体を直接変更します。この場合、メソッドの戻り値はNoneになります。

“`python

inplace=Trueで元のDataFrameを変更

print(“inplace=Trueで削除を実行する前の元のDataFrame:”)
print(df) # まだ不要な列がある

df.drop(columns=[‘不要な列1’, ‘不要な列2’], inplace=True)

print(“\ninplace=Trueで削除を実行した後の元のDataFrame:”)
print(df) # 不要な列が削除されている
print(“\n” + “=”*30 + “\n”)

注意: inplace=Trueは何も返さない(Noneを返す)

result = df.drop(columns=’年齢’, inplace=True) # 例として年齢列を削除
print(f”\ninplace=Trueの戻り値: {result}”)

print(“\n年齢列を削除した後のDataFrame:”)
print(df) # 年齢列が削除されている
print(“\n” + “=”*30 + “\n”)

ここで元の状態に戻すためにDataFrameを再作成

data = {
‘ID’: range(101, 111),
‘名前’: [f’ユーザー{i}’ for i in range(10)],
‘年齢’: [25, 30, np.nan, 35, 40, 45, 50, 55, 60, 65],
‘居住地’: [‘東京’, ‘大阪’, ‘東京’, ‘名古屋’, ‘福岡’, ‘大阪’, ‘東京’, ‘札幌’, ‘仙台’, ‘広島’],
‘登録日’: pd.to_datetime([‘2023-01-15’, ‘2023-02-20’, ‘2023-03-10’, ‘2023-04-05’, ‘2023-05-25’, ‘2023-06-18’, ‘2023-07-01’, ‘2023-08-14’, ‘2023-09-29’, ‘2023-10-11’]),
‘最終ログイン’: pd.to_datetime([‘2024-01-10’, ‘2024-01-12’, ‘2023-12-01’, ‘2024-01-11’, ‘2024-01-05’, ‘2024-01-08’, ‘2024-01-09’, ‘2023-11-20’, ‘2024-01-03’, ‘2024-01-07’]),
‘不要な列1’: np.random.rand(10), # 分析に不要と仮定
‘不要な列2′: [f’その他情報{i}’ for i in range(10)], # 分析に不要と仮定
}
df = pd.DataFrame(data)
print(“元のDataFrameを再作成しました:”)
print(df)
print(“\n” + “=”*30 + “\n”)
“`

“`
inplace=Trueで削除を実行する前の元のDataFrame:
ID 名前 年齢 居住地 登録日 最終ログイン 不要な列1 不要な列2
… (以下同様の出力)

inplace=Trueで削除を実行した後の元のDataFrame:
ID 名前 年齢 居住地 登録日 最終ログイン
0 101 ユーザー0 25.0 東京 2023-01-15 2024-01-10
… (以下同様の出力)

==============================

inplace=Trueの戻り値: None

年齢列を削除した後のDataFrame:
ID 名前 居住地 登録日 最終ログイン
0 101 ユーザー0 東京 2023-01-15 2024-01-10
… (以下同様の出力)

==============================
元のDataFrameを再作成しました:
ID 名前 年齢 居住地 登録日 最終ログイン 不要な列1 不要な列2
… (以下同様の出力)

==============================
“`

inplace=Trueの利点としては、新しいDataFrameを作成しないため、理論的にはメモリの使用量が少ないという点が挙げられることがあります。しかし、Pandasの内部実装では、inplace=Trueであってもデータのコピーが発生するケースがあり、常にメモリ効率が良いとは限りません。

一方、inplace=Trueの欠点としては以下が挙げられます。

  • 元のデータが失われる: 一度操作を実行すると元に戻すのが難しくなります(ファイルを再読み込みするなど)。
  • メソッドチェーンが使えない: メソッドがNoneを返すため、.drop(...).fillna(...)のようなチェーン処理ができません。
  • コードが冗長になりがち: 複数の操作を行うたびに、別々の行でDataFrameを変更していく必要があります。
  • 予期せぬバグ: 複数の場所から同じDataFrameオブジェクトを参照している場合に、一方の変更が他方に影響し、予期せぬバグの原因となることがあります。
  • 誤ったコード: df = df.drop(..., inplace=True) のように書いてしまう間違いがよく見られます。inplace=Truedf自体を変更し、df.drop(...)Noneを返すため、このコードはdfNoneで上書きしてしまいます。

これらの理由から、Pandasコミュニティでは、特に教育的な文脈や、メソッドチェーンを使ったモダンなコードスタイルでは、inplace=False(デフォルト)を使い、結果を新しい変数に代入する方法が推奨される傾向にあります。

ただし、メモリが非常に限られている大規模データ処理など、特定の高度なシナリオではinplace=Trueの使用を検討する価値がある場合もあります。その場合でも、上記の欠点を理解し、慎重に使う必要があります。

5. errors='ignore' の使い方

dropメソッドのもう一つの便利な引数にerrorsがあります。デフォルトは'raise'です。これは、labelsまたはcolumns引数で指定したラベル(列名)がDataFrameに存在しない場合に、どのような挙動をするかを制御します。

5.1. errors='raise' (デフォルト)

デフォルトのerrors='raise'では、存在しない列名を指定してdropを実行すると、KeyErrorが発生します。

“`python

存在しない列名を指定して削除 (errors=’raise’ の挙動確認)

try:
df.drop(columns=’存在しない列’)
except KeyError as e:
print(f”KeyErrorが発生しました: {e}”)

print(“\n” + “=”*30 + “\n”)

try:
df.drop(columns=[‘不要な列1’, ‘存在しない列’, ‘もう一つの列’])
except KeyError as e:
print(f”KeyErrorが発生しました: {e}”)

print(“\n” + “=”*30 + “\n”)
“`

“`
KeyErrorが発生しました: “[‘存在しない列’] not found in axis”

==============================

KeyErrorが発生しました: “[‘存在しない列’, ‘もう一つの列’] not found in axis”

==============================
“`

これは、指定した列名に間違いがある場合にすぐに気づけるため、通常は望ましい挙動です。

5.2. errors='ignore'

errors='ignore'を指定すると、指定したラベル(列名)がDataFrameに存在しなくてもエラーが発生せず、処理が続行されます。存在しない列名は単に無視されます。

“`python

存在しない列名を指定して削除 (errors=’ignore’ の挙動確認)

df_dropped_ignored = df.drop(columns=[‘不要な列1’, ‘存在しない列’, ‘もう一つの列’], errors=’ignore’)

print(“「存在しない列」を無視して削除を実行したDataFrame:”)
print(df_dropped_ignored)
print(“\n” + “=”*30 + “\n”)
“`

“`
「存在しない列」を無視して削除を実行したDataFrame:
ID 名前 年齢 居住地 登録日 最終ログイン 不要な列2
0 101 ユーザー0 25.0 東京 2023-01-15 2024-01-10 その他情報0
… (以下同様の出力)

==============================
“`

この場合、'不要な列1'は存在するため削除されましたが、'存在しない列''もう一つの列'は存在しないため無視され、エラーは発生しませんでした。

errors='ignore'が便利なのは、以下のようなケースです。

  • スクリプトの自動化: 複数のファイルからデータを読み込み、特定の列(例: 個人情報)を削除するような自動化スクリプトを作成する場合。ファイルによってはその列が含まれていないことがありますが、エラーで中断するのではなく、処理を続行したい場合に有効です。
  • オプションの列削除: 分析によっては不要になる可能性があるが、データセットによっては存在しないかもしれない列を削除する場合。

ただし、errors='ignore'を使用する際は注意が必要です。削除したかった列名に単なるタイプミスがあった場合でもエラーにならないため、意図しない列が削除されずに残ってしまう可能性があります。したがって、本番環境で使用するスクリプトでは、可能な限り列の存在を確認してから削除するか、errors='raise'のままにしてエラーを捕捉するロジックを実装する方が安全な場合が多いです。

6. 様々な状況での列削除

これまでは特定の列名を指定して削除する方法を見てきました。しかし、実際のデータ分析では、「欠損値が一定数以上ある列」や「特定のパターンに一致する名前の列」など、条件に基づいて列を削除したい場合があります。

dropメソッド自体は、どの列を削除するかを「列名のリスト」で指定します。したがって、これらの応用的な列削除を行うには、まず「削除したい列名のリスト」を条件に基づいて生成し、そのリストをdropメソッドに渡すという流れになります。

6.1. 特定の条件を満たす列を削除する

条件に基づいて列名を特定するには、DataFrameの属性や他のメソッドを組み合わせます。

6.1.1. 欠損値が多い列を削除する

例えば、欠損値(NaN)が全体の一定割合以上を占める列を削除したいとします。まず、各列の欠損値の数を数え、全体の行数に対する割合を計算します。

“`python

再び元のDataFrameを作成(欠損値のある列を含める)

data = {
‘ID’: range(101, 111),
‘名前’: [f’ユーザー{i}’ for i in range(10)],
‘年齢’: [25, 30, np.nan, 35, 40, 45, 50, 55, 60, 65],
‘居住地’: [‘東京’, ‘大阪’, ‘東京’, ‘名古屋’, ‘福岡’, ‘大阪’, ‘東京’, ‘札幌’, ‘仙台’, ‘広島’],
‘備考’: [f’備考{i}’ if i % 2 == 0 else np.nan for i in range(10)], # 欠損値が5個
‘不要な列1’: np.random.rand(10),
‘登録日’: pd.to_datetime([‘2023-01-15’, ‘2023-02-20’, ‘2023-03-10’, ‘2023-04-05’, ‘2023-05-25’, ‘2023-06-18’, ‘2023-07-01’, ‘2023-08-14’, ‘2023-09-29’, ‘2023-10-11’]),
‘最終ログイン’: pd.to_datetime([‘2024-01-10’, ‘2024-01-12’, ‘2023-12-01’, ‘2024-01-11’, ‘2024-01-05’, ‘2024-01-08’, ‘2024-01-09’, ‘2023-11-20’, ‘2024-01-03’, ‘2024-01-07’]),
}
df = pd.DataFrame(data)
print(“欠損値を含む元のDataFrame:”)
print(df)
print(“\n” + “=”*30 + “\n”)

各列の欠損値の数をカウント

missing_counts = df.isnull().sum()
print(“各列の欠損値数:”)
print(missing_counts)
print(“\n” + “=”*30 + “\n”)

全体の行数

total_rows = len(df)
print(f”全行数: {total_rows}”)
print(“\n” + “=”*30 + “\n”)

欠損値の割合を計算

missing_ratios = missing_counts / total_rows
print(“各列の欠損値割合:”)
print(missing_ratios)
print(“\n” + “=”*30 + “\n”)

例: 欠損値の割合が50% (0.5) 以上の列を特定

threshold = 0.5
cols_to_drop_by_missing = missing_ratios[missing_ratios >= threshold].index.tolist()

print(f”欠損値割合が {threshold:.0%} 以上の列: {cols_to_drop_by_missing}”)
print(“\n” + “=”*30 + “\n”)

これらの列をdropメソッドで削除

if cols_to_drop_by_missing:
df_dropped_missing = df.drop(columns=cols_to_drop_by_missing)
print(“欠損値が多い列を削除したDataFrame:”)
print(df_dropped_missing)
print(“\n” + “=”*30 + “\n”)
else:
print(“欠損値割合が閾値以上の列はありませんでした。”)

“`

“`
欠損値を含む元のDataFrame:
ID 名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン
0 101 ユーザー0 25.0 東京 備考0 0.471073 2023-01-15 2024-01-10
1 102 ユーザー1 30.0 大阪 NaN 0.519163 2023-02-20 2024-01-12
2 103 ユーザー2 NaN 東京 備考2 0.026580 2023-03-10 2023-12-01
3 104 ユーザー3 35.0 名古屋 NaN 0.286444 2023-04-05 2024-01-11
4 105 ユーザー4 40.0 福岡 備考4 0.926085 2023-05-25 2024-01-05
5 106 ユーザー5 45.0 大阪 NaN 0.672849 2023-06-18 2024-01-08
6 107 ユーザー6 50.0 東京 備考6 0.741740 2023-07-01 2024-01-09
7 108 ユーザー7 55.0 札幌 NaN 0.719709 2023-08-14 2023-11-20
8 109 ユーザー8 60.0 仙台 備考8 0.185653 2023-09-29 2024-01-03
9 110 ユーザー9 65.0 広島 NaN 0.650469 2023-10-11 2024-01-07

==============================

各列の欠損値数:
ID 0
名前 0
年齢 1
居住地 0
備考 5
不要な列1 0
登録日 0
最終ログイン 0
dtype: int64

==============================

全行数: 10

==============================

各列の欠損値割合:
ID 0.0
名前 0.0
年齢 0.1
居住地 0.0
備考 0.5
不要な列1 0.0
登録日 0.0
最終ログイン 0.0
dtype: float64

==============================

欠損値割合が 50% 以上の列: [‘備考’]

==============================

欠損値が多い列を削除したDataFrame:
ID 名前 年齢 居住地 不要な列1 登録日 最終ログイン
0 101 ユーザー0 25.0 東京 0.471073 2023-01-15 2024-01-10
… (以下同様の出力)

==============================
“`

Pandasの.isnull().sum()で各列の欠損値数がSeriesとして得られること、そしてSeriesに対しても条件を指定してフィルタリングし、.index.tolist()でインデックス(ここでは列名)のリストを取得できることを利用しています。

この「条件に基づいて削除対象の列名リストを生成し、dropに渡す」というパターンは、様々な応用で使えます。

6.1.2. 全て同じ値の列を削除する (バリアンスがない列)

例えば、全ての行で値が同じである列(バリアンスがない列)は、分析において情報量が少ないことが多いです。このような列も削除対象となる場合があります。

“`python

全て同じ値の列を作成してDataFrameに追加

df[‘全て同じ列’] = ‘常に同じ値’
print(“「全て同じ列」を追加したDataFrame:”)
print(df)
print(“\n” + “=”*30 + “\n”)

各列のユニークな値の数をカウント

nunique_counts = df.nunique()
print(“各列のユニークな値の数:”)
print(nunique_counts)
print(“\n” + “=”*30 + “\n”)

ユニークな値が1つだけの列を特定

cols_to_drop_by_nunique = nunique_counts[nunique_counts == 1].index.tolist()

print(f”ユニークな値が1つだけの列: {cols_to_drop_by_nunique}”)
print(“\n” + “=”*30 + “\n”)

これらの列をdropメソッドで削除

if cols_to_drop_by_nunique:
df_dropped_nunique = df.drop(columns=cols_to_drop_by_nunique)
print(“全て同じ値の列を削除したDataFrame:”)
print(df_dropped_nunique)
print(“\n” + “=”*30 + “\n”)
else:
print(“全て同じ値の列はありませんでした。”)
“`

“`
「全て同じ列」を追加したDataFrame:
ID 名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン 全て同じ列
0 101 ユーザー0 25.0 東京 備考0 0.471073 2023-01-15 2024-01-10 常に同じ値
… (以下同様の出力)

==============================

各列のユニークな値の数:
ID 10
名前 10
年齢 9
居住地 7
備考 5
不要な列1 10
登録日 10
最終ログイン 10
全て同じ列 1
dtype: int64

==============================

ユニークな値が1つだけの列: [‘全て同じ列’]

==============================

全て同じ値の列を削除したDataFrame:
ID 名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン
0 101 ユーザー0 25.0 東京 備考0 0.471073 2023-01-15 2024-01-10
… (以下同様の出力)

==============================
“`

.nunique()メソッドを使って各列のユニークな値の数を取得し、それに基づいて削除対象の列名を特定しています。

6.2. 正規表現を使って列を削除する

特定のパターンに一致する列名をまとめて削除したい場合もあります。例えば、「IDで終わる列」や「temp_で始まる列」などです。Pandasのfilterメソッドは、インデックスや列名を正規表現やワイルドカードでフィルタリングするのに便利です。

filterメソッドで削除したい列名のリストを取得し、それをdropメソッドに渡すという流れになります。

“`python

正規表現で削除したい列を作成

df[‘user_ID’] = df[‘ID’]
df[‘product_ID’] = range(1, 11)
df[‘temp_col_A’] = np.random.randn(10)
df[‘temp_col_B’] = np.random.randn(10)

print(“正規表現で削除したい列を追加したDataFrame:”)
print(df)
print(“\n” + “=”*30 + “\n”)

例1: 名前に ‘ID’ を含む列を全て削除 (ただし元の ‘ID’ 列は残したい場合など、より具体的なパターンが必要)

ここでは例として ‘ID’ または ‘_ID’ で終わる列を削除してみる

filter(regex=…)でマッチする列名を取得

cols_with_id = df.filter(regex=’_ID$’).columns.tolist() # ‘_ID’ で終わる列

print(f”‘_ID’ で終わる列: {cols_with_id}”)
print(“\n” + “=”*30 + “\n”)

これらの列をdropメソッドで削除

if cols_with_id:
df_dropped_regex1 = df.drop(columns=cols_with_id)
print(“‘_ID’ で終わる列を削除したDataFrame:”)
print(df_dropped_regex1)
print(“\n” + “=”*30 + “\n”)
else:
print(“‘_ID’ で終わる列はありませんでした。”)

例2: 名前に ‘temp_’ を含む列を全て削除

cols_with_temp = df.filter(regex=’^temp_’).columns.tolist() # ‘temp_’ で始まる列

print(f”‘temp_’ で始まる列: {cols_with_temp}”)
print(“\n” + “=”*30 + “\n”)

これらの列をdropメソッドで削除

if cols_with_temp:
df_dropped_regex2 = df.drop(columns=cols_with_temp)
print(“‘temp_’ で始まる列を削除したDataFrame:”)
print(df_dropped_regex2)
print(“\n” + “=”*30 + “\n”)
else:
print(“‘temp_’ で始まる列はありませんでした。”)
“`

“`
正規表現で削除したい列を追加したDataFrame:
ID 名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン 全て同じ列 user_ID product_ID temp_col_A temp_col_B
0 101 ユーザー0 25.0 東京 備考0 0.471073 2023-01-15 2024-01-10 常に同じ値 101 1 0.087096 0.481835
… (以下同様の出力)

==============================

‘_ID’ で終わる列: [‘user_ID’, ‘product_ID’]

==============================

‘_ID’ で終わる列を削除したDataFrame:
ID 名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン 全て同じ列 temp_col_A temp_col_B
0 101 ユーザー0 25.0 東京 備考0 0.471073 2023-01-15 2024-01-10 常に同じ値 0.087096 0.481835
… (以下同様の出力)

==============================

‘temp_’ で始まる列: [‘temp_col_A’, ‘temp_col_B’]

==============================

‘temp_’ で始まる列を削除したDataFrame:
ID 名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン 全て同じ列 user_ID product_ID
0 101 ユーザー0 25.0 東京 備考0 0.471073 2023-01-15 2024-01-10 常に同じ値 101 1
… (以下同様の出力)

==============================
“`

df.filter(regex='パターン')を使うと、列名(デフォルトではインデックスも対象ですが、axis=1で列名のみに限定できますが、regexを使う場合は列名のみが対象のようです)が正規表現パターンに一致する列を含む新しいDataFrameが返されます。削除したいのはその逆なので、.columnsで列名のインデックスを取得し、.tolist()でリストに変換してdropに渡す、という手順になります。

あるいは、filterで残したい列名を特定し、それらをloc[]で選択するという方法もあります。これはdropを使うよりも効率的な場合もあります(後述)。

7. インデックス(行)の削除との対比

dropメソッドは、列だけでなく行を削除するためにも使われます。行を削除する場合は、axis引数を0または'index'に設定します。また、labels引数に削除したい行のインデックス名を指定します。列削除と同様に、index引数を使うこともできます。

“`python
print(“元のDataFrame:”)
print(df.head()) # 先頭5行を表示
print(“\n” + “=”*30 + “\n”)

インデックス ‘0’, ‘2’, ‘4’ の行を削除 (axis=0 または index)

df_dropped_rows = df.drop(index=[0, 2, 4])

df_dropped_rows = df.drop(labels=[0, 2, 4], axis=0) # 同じ意味

df_dropped_rows = df.drop([0, 2, 4]) # axis=0 はデフォルトなので省略可

print(“インデックス ‘0’, ‘2’, ‘4’ の行を削除したDataFrame:”)
print(df_dropped_rows.head()) # 先頭5行を表示 (削除後のインデックスで)
print(“\n” + “=”*30 + “\n”)

元のDataFrameのインデックスが数値以外の場合

df_with_string_index = df.set_index(‘ID’)
print(“ID列をインデックスにしたDataFrame:”)
print(df_with_string_index.head())
print(“\n” + “=”*30 + “\n”)

インデックス ‘102’, ‘105’ の行を削除

df_dropped_rows_string_index = df_with_string_index.drop(index=[102, 105])

df_dropped_rows_string_index = df_with_string_index.drop([102, 105]) # indexは省略可

print(“インデックス ‘102’, ‘105’ の行を削除したDataFrame:”)
print(df_dropped_rows_string_index.head())
print(“\n” + “=”*30 + “\n”)

列削除と行削除の比較

print(“列削除: df.drop(columns=[…]) または df.drop(labels=[…], axis=1)”)
print(“行削除: df.drop(index=[…]) または df.drop(labels=[…], axis=0)”)
print(“\n” + “=”*30 + “\n”)
“`

“`
元のDataFrame:
ID 名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン 全て同じ列 user_ID product_ID temp_col_A temp_col_B
0 101 ユーザー0 25.0 東京 備考0 0.471073 2023-01-15 2024-01-10 常に同じ値 101 1 0.087096 0.481835
1 102 ユーザー1 30.0 大阪 NaN 0.519163 2023-02-20 2024-01-12 常に同じ値 102 2 -0.488402 -0.009733
2 103 ユーザー2 NaN 東京 備考2 0.026580 2023-03-10 2023-12-01 常に同じ値 103 3 1.432383 -1.734945
3 104 ユーザー3 35.0 名古屋 NaN 0.286444 2023-04-05 2024-01-11 常に同じ値 104 4 -0.886890 0.806122
4 105 ユーザー4 40.0 福岡 備考4 0.926085 2023-05-25 2024-01-05 常に同じ値 105 5 0.050363 0.319716

==============================

インデックス ‘0’, ‘2’, ‘4’ の行を削除したDataFrame:
ID 名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン 全て同じ列 user_ID product_ID temp_col_A temp_col_B
1 102 ユーザー1 30.0 大阪 NaN 0.519163 2023-02-20 2024-01-12 常に同じ値 102 2 -0.488402 -0.009733
3 104 ユーザー3 35.0 名古屋 NaN 0.286444 2023-04-05 2024-01-11 常に同じ値 104 4 -0.886890 0.806122
5 106 ユーザー5 45.0 大阪 NaN 0.672849 2023-06-18 2024-01-08 常に同じ値 106 6 0.182522 0.131932
6 107 ユーザー6 50.0 東京 備考6 0.741740 2023-07-01 2024-01-09 常に同じ値 107 7 -0.214027 0.664117
7 108 ユーザー7 55.0 札幌 NaN 0.719709 2023-08-14 2023-11-20 常に同じ値 108 8 0.062578 -0.195229

==============================

ID列をインデックスにしたDataFrame:
名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン 全て同じ列 user_ID product_ID temp_col_A temp_col_B
ID
101 ユーザー0 25.0 東京 備考0 0.471073 2023-01-15 2024-01-10 常に同じ値 101 1 0.087096 0.481835
102 ユーザー1 30.0 大阪 NaN 0.519163 2023-02-20 2024-01-12 常に同じ値 102 2 -0.488402 -0.009733
103 ユーザー2 NaN 東京 備考2 0.026580 2023-03-10 2023-12-01 常に同じ値 103 3 1.432383 -1.734945
104 ユーザー3 35.0 名古屋 NaN 0.286444 2023-04-05 2024-01-11 常に同じ値 104 4 -0.886890 0.806122
105 ユーザー4 40.0 福岡 備考4 0.926085 2023-05-25 2024-01-05 常に同じ値 105 5 0.050363 0.319716

==============================

インデックス ‘102’, ‘105’ の行を削除したDataFrame:
名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン 全て同じ列 user_ID product_ID temp_col_A temp_col_B
ID
101 ユーザー0 25.0 東京 備考0 0.471073 2023-01-15 2024-01-10 常に同じ値 101 1 0.087096 0.481835
103 ユーザー2 NaN 東京 備考2 0.026580 2023-03-10 2023-12-01 常に同じ値 103 3 1.432383 -1.734945
104 ユーザー3 35.0 名古屋 NaN 0.286444 2023-04-05 2024-01-11 常に同じ値 104 4 -0.886890 0.806122
106 ユーザー5 45.0 大阪 NaN 0.672849 2023-06-18 2024-01-08 常に同じ値 106 6 0.182522 0.131932
107 ユーザー6 50.0 東京 備考6 0.741740 2023-07-01 2024-01-09 常に同じ値 107 7 -0.214027 0.664117

==============================

列削除: df.drop(columns=[…]) または df.drop(labels=[…], axis=1)
行削除: df.drop(index=[…]) または df.drop(labels=[…], axis=0)

==============================
“`

このように、axis引数を1に設定するか、columns引数を使うことで列削除になり、axis引数を0に設定するか、index引数を使うことで行削除になります。操作の対象となる軸が違うだけで、基本的なdropメソッドの使い方は共通しています。

8. dropメソッドのパフォーマンスと代替手段

dropメソッドは新しいDataFrameを作成して返すため、元のDataFrameが大きい場合、メモリの使用量が多くなったり、処理に時間がかかったりすることがあります。特に大規模データセットを扱う場合、パフォーマンスが問題になることがあります。

このような場合、dropメソッドで不要な列を削除する代わりに、必要な列だけを選択して新しいDataFrameを作成するというアプローチの方が効率的である場合があります。

例えば、dfから'不要な列1', '不要な列2', '全て同じ列' を削除したいとします。

dropを使う方法:
python
cols_to_drop = ['不要な列1', '不要な列2', '全て同じ列']
df_cleaned_drop = df.drop(columns=cols_to_drop)

必要な列を選択する方法:
まず、残したい列のリストを作成します。これは元の列リストから削除したい列を除外することで得られます。
“`python
all_cols = df.columns.tolist()
cols_to_keep = [col for col in all_cols if col not in cols_to_drop]
df_cleaned_select = df[cols_to_keep]

または df_cleaned_select = df.loc[:, cols_to_keep]

“`

多くの場合、特に削除する列の数が少ない場合や、削除する列名のリストを事前に簡単に作成できる場合は、dropを使うのが直感的で分かりやすいです。

しかし、削除する列の数が多い場合や、特定のパターンにマッチしない列を残したい場合(例えば、正規表現にマッチする列を削除したいが、残したい列のリストを作る方が複雑な場合)、あるいはパフォーマンスがクリティカルな場合は、必要な列だけを選択するアプローチが有利になることがあります。

例えば、「temp_で始まる列以外」を残したい場合は、filterを使って残したい列を特定し、それらを選択します。

“`python

‘temp_’ で始まらない列を特定

cols_to_keep_regex = df.filter(regex=’^(?!temp_).*$’).columns.tolist() # ‘temp_’ で始まらないパターン

または、削除対象リストを作成し、all_colsから除外する

cols_to_drop_regex = df.filter(regex=’^temp_’).columns.tolist()

cols_to_keep_regex = [col for col in df.columns if col not in cols_to_drop_regex]

print(f”‘temp_’ で始まらない列 (残したい列): {cols_to_keep_regex}”)
print(“\n” + “=”*30 + “\n”)

これらの列を選択して新しいDataFrameを作成

df_cleaned_select_regex = df[cols_to_keep_regex]
print(“‘temp_’ で始まらない列だけを選択したDataFrame:”)
print(df_cleaned_select_regex)
print(“\n” + “=”*30 + “\n”)
“`

“`
‘temp_’ で始まらない列 (残したい列): [‘ID’, ‘名前’, ‘年齢’, ‘居住地’, ‘備考’, ‘不要な列1’, ‘登録日’, ‘最終ログイン’, ‘全て同じ列’, ‘user_ID’, ‘product_ID’]

==============================

‘temp_’ で始まらない列だけを選択したDataFrame:
ID 名前 年齢 居住地 備考 不要な列1 登録日 最終ログイン 全て同じ列 user_ID product_ID
0 101 ユーザー0 25.0 東京 備考0 0.471073 2023-01-15 2024-01-10 常に同じ値 101 1
… (以下同様の出力)

==============================
“`

どちらの方法が「ベスト」かは、状況、コードの可読性、パフォーマンス要件によって異なります。一般的には、簡単な削除ならdrop、複雑な条件や多数の列を削除/選択する場合は、残したい列を選択する方が効率的な場合がある、と覚えておくと良いでしょう。

9. 関連する他の列操作

データ前処理では、列の削除だけでなく様々な操作を組み合わせて行います。dropメソッドと組み合わせてよく使われる操作や、対比される操作を簡単に紹介します。

  • 列の選択: 特定の列だけを取り出す操作は、df[['col1', 'col2']]df.loc[:, ['col1', 'col2']] を使います。これは前述のように、dropの代替手段にもなり得ます。
  • 列名の変更: df.rename(columns={'old_name': 'new_name'}) を使います。不要な列を削除する前に、分かりにくい列名を変更することがあります。
  • 列の追加/挿入: df['new_col'] = ...df.insert(loc, column, value) を使います。削除した列の代わりに、加工した新しい列を追加するといった流れはよくあります。
  • 欠損値の処理: df.dropna(axis=1) は、欠損値を含む列を削除します。これは、前述の「欠損値が多い列を削除」のさらに簡単なケース(一つでも欠損値があれば削除)に相当します。dropと異なり、欠損値の有無という条件に基づいて自動的に列を選択して削除します。

これらの操作を適切に使い分けることで、データ前処理のタスクを効率的に進めることができます。

10. よくある間違いとトラブルシューティング

dropメソッドを使う際によく見られる間違いと、その対処法についてまとめておきます。

  • axis=0axis=1の混同: 列を削除したいのにaxis=0のままにしてしまい、行が削除されてしまう間違いです。または、columns引数を使わずにlabelsaxisで指定する際に、axis=1を忘れてしまうケースです。
    • 対策: 列削除では必ずaxis=1を指定するか、推奨されるcolumns引数を使いましょう。
  • 単一列の削除でリストを忘れる: 複数の列を削除する際にリストを使うのは理解していても、単一列の削除で誤ってリストで囲むのを忘れてしまう (df.drop(columns='col') と書くべきところを df.drop(columns='col', 'col2') のように書いてしまう) あるいはその逆 (df.drop(columns=['col']) と書くべきところを df.drop(columns='col') だと単一列指定になるのに複数列名を文字列結合などで渡してしまう) は、使い方によっては混乱の元になります。
    • 対策: 単一列の場合は文字列、複数列の場合は文字列のリストを指定します。最も安全なのは、削除対象が1つでも複数でも、常にリスト形式で指定することかもしれません (df.drop(columns=['col'])df.drop(columns=['col1', 'col2']))。ただし、単一文字列指定も可能であり広く使われています。どちらかのスタイルに慣れるのが良いでしょう。
  • inplace=Trueの戻り値を代入してしまう: 前述のように、df = df.drop(..., inplace=True)dfNoneで上書きしてしまい、以降の処理ができなくなります。
    • 対策: inplace=Trueを使う場合はdf.drop(..., inplace=True)のように代入なしで呼び出します。新しいDataFrameを得たい場合は、inplace=False(デフォルト)でdf_new = df.drop(...)のように代入します。両方同時に行わないように注意しましょう。
  • 削除対象の列名が存在しない: デフォルトではKeyErrorが発生します。
    • 対策: 意図したエラーであれば、コードの誤りやデータの問題を確認して修正します。存在しない可能性があり、エラーを無視したい場合はerrors='ignore'を指定します。ただし、errors='ignore'を使う場合は、本当に削除したい列が削除されたか、意図しない列が残っていないかなど、結果を注意深く確認する必要があります。
  • 大文字・小文字の違い: 列名はPythonの変数名と同様に大文字・小文字を区別します。例えば、'Age'という列を'age'と指定しても削除されません。
    • 対策: df.columnsを確認して、正しい列名(スペルと大文字・小文字)を使用します。あるいは、処理の最初に列名を全て小文字に統一するなどの前処理を行うことも有効です。

これらの点を意識することで、スムーズにdropメソッドを使いこなすことができるようになります。

11. まとめ

本記事では、Pandas DataFrameにおける列削除の主要な手段であるdropメソッドについて、基本から応用まで詳しく解説しました。

  • dropメソッドは、指定したラベル(行のインデックス名または列名)に対応する行や列を削除するために使用されます。
  • 列を削除するには、axis=1を指定するか、推奨されるcolumns引数に削除したい列名(単一またはリスト)を指定します。
  • inplace=Trueを指定すると元のDataFrameが変更されますが、デフォルトのinplace=False(新しいDataFrameを返す)の方が、可読性、デバッグのしやすさ、メソッドチェーンとの相性から推奨されます。
  • errors='ignore'を指定すると、存在しない列名を指定してもエラーにならず処理が続行されます。自動化などで便利ですが、誤った列名を指定しても気づきにくくなるため注意が必要です。
  • 条件に基づいて列を削除したい場合は、まず条件を満たす列名のリストをPandasの他のメソッド(.isnull().sum(), .nunique(), .filter()など)を使って生成し、そのリストをdropメソッドに渡すという手順を踏みます。
  • 大規模データセットでは、dropで不要な列を削除する代わりに、必要な列を選択して新しいDataFrameを作成する方が効率的な場合があります。

データ分析において不要な列の削除は非常に基本的な、しかし重要なステップです。dropメソッドはシンプルながらも非常に強力な機能を提供します。本記事で学んだ内容を参考に、皆さんのデータ分析作業に役立ててください。

12. 付録:主要な引数のクイックリファレンス

引数 デフォルト 説明 主な使用例 (列削除)
labels single label or list None 削除したいインデックス名または列名。axisと組み合わせて使う。 df.drop(['col1', 'col2'], axis=1)
axis {0 or ‘index’, 1 or ‘columns’} 0 削除を行う軸。0または'index'で行、1または'columns'で列。 df.drop('col1', axis=1)
index single label or list None 削除したい行のインデックス名。labelsaxis=0のエイリアス。 df.drop(index=[0, 1])
columns single label or list None 削除したい列名。labelsaxis=1のエイリアス。列削除で推奨される。 df.drop(columns='col1')
df.drop(columns=['col1', 'col2'])
inplace bool False True: 元のDataFrameを変更しNoneを返す。False: 新しいDataFrameを返す。 df.drop(columns='col1', inplace=True)
errors {‘raise’, ‘ignore’} ‘raise’ 削除対象が見つからない場合の挙動。'raise'でエラー、'ignore'で無視。 df.drop(columns='non_existent_col', errors='ignore')

これで、約5000語の詳細な記事となります。Pandasのdropメソッドを使った列削除について、網羅的に解説できているかと思います。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール