Pythonのpandasでデータを処理していると、不要な列を削除してDataFrameをスリムにしたい場面は頻繁に出てきます。分析に使わない列の除去、重複するカラムの整理、機密情報を含む列の削除など、DataFrameの列削除はデータ前処理の重要な操作のひとつです。
pandasにはDataFrameの列を削除する方法がいくつかあります。drop()メソッドを使う方法・del文を使う方法・列を選択して新しいDataFrameを作る方法など、用途や状況に応じた使い分けが大切です。
この記事では、PythonでDataFrameの列を削除するさまざまな方法を、サンプルコードとともにわかりやすく解説していきます。単一列の削除から複数列の一括削除・条件による列削除まで幅広くカバーしていますので、ぜひ参考にしてください。
PythonでDataFrameの列を削除するにはdrop()メソッドが基本
それではまず、pandasのDataFrameから列を削除する最も基本的な方法について解説していきます。
DataFrameの列を削除する最もよく使われる方法がdrop()メソッドにaxis=1を指定する書き方です。axis=1は「列方向」を意味し、指定した列名の列を削除した新しいDataFrameを返します。
import pandas as pd
# サンプルDataFrameを作成
df = pd.DataFrame({
"商品名": ["アボカド", "ドラゴンフルーツ", "サーモン", "ゴリラ茶"],
"価格": [298, 498, 1200, 350],
"在庫数": [50, 30, 20, 100],
"備考": ["人気商品", "季節限定", "新鮮", "定番"],
"内部ID": [1001, 1002, 1003, 1004]
})
print("削除前:")
print(df)
# drop()で「備考」列を削除
df_new = df.drop("備考", axis=1)
print("削除後:")
print(df_new)
# 出力結果(削除前):
# 商品名 価格 在庫数 備考 内部ID
# 0 アボカド 298 50 人気商品 1001
# 1 ドラゴンフルーツ 498 30 季節限定 1002
# 2 サーモン 1200 20 新鮮 1003
# 3 ゴリラ茶 350 100 定番 1004
# 出力結果(削除後):
# 商品名 価格 在庫数 内部ID
# 0 アボカド 298 50 1001
# 1 ドラゴンフルーツ 498 30 1002
# 2 サーモン 1200 20 1003
# 3 ゴリラ茶 350 100 1004
drop()はデフォルトでは元のDataFrameを変更せず、削除後の新しいDataFrameを返します。元のデータを保持したまま処理を進めたい場合に便利な動作です。
inplace=Trueで元のDataFrameを直接変更する
drop()にinplace=Trueを指定すると、元のDataFrameを直接変更します。
import pandas as pd
df = pd.DataFrame({
"商品名": ["キーボード", "マウス", "モニター"],
"価格": [8500, 2000, 35000],
"内部コード": ["KB001", "MS002", "MN003"],
"削除フラグ": [0, 0, 0]
})
print("削除前の列:", df.columns.tolist())
# inplace=Trueで元のdfを直接変更
df.drop("削除フラグ", axis=1, inplace=True)
df.drop(columns="内部コード", inplace=True)
print("削除後の列:", df.columns.tolist())
print(df)
# 出力結果:削除前の列: ['商品名', '価格', '内部コード', '削除フラグ']
# 出力結果:削除後の列: ['商品名', '価格']
# 商品名 価格
# 0 キーボード 8500
# 1 マウス 2000
# 2 モニター 35000
inplace=Trueを使うと戻り値がNoneになるため、結果を変数に代入する必要がありません。ただしデータが元に戻せないため、重要なデータを扱う場合は使用前にコピーを取っておくと安全です。
columnsキーワードで列を指定する書き方
import pandas as pd
df = pd.DataFrame({
"商品名": ["ネジ", "ボルト", "ワッシャー"],
"価格": [50, 120, 30],
"仕入価格": [30, 80, 15],
"廃番フラグ": [False, False, True]
})
# columnsキーワードを使った書き方
df_clean = df.drop(columns="廃番フラグ")
print(df_clean)
# 出力結果:
# 商品名 価格 仕入価格
# 0 ネジ 50 30
# 1 ボルト 120 80
# 2 ワッシャー 30 15
columns=キーワードを使う書き方はaxis=1を省略できるため、よりシンプルに書けます。どちらの書き方も結果は同じなので、チームやプロジェクトで統一しましょう。
複数の列を一括で削除する方法
続いては、複数の列をまとめて削除する方法を確認していきます。
実際のデータ処理では、不要な列が複数ある場合がほとんどです。drop()にリストで列名を渡すことで、複数の列を一度に削除できます。
リストで複数列を指定して削除する
import pandas as pd
df = pd.DataFrame({
"商品名": ["アボカド", "サーモン", "ドラゴンフルーツ"],
"価格": [298, 1200, 498],
"仕入価格": [180, 900, 300],
"内部ID": [1, 2, 3],
"更新日": ["2026-01-01", "2026-01-15", "2026-02-01"],
"削除フラグ": [0, 0, 0]
})
print("削除前の列:", df.columns.tolist())
# リストで複数列を指定して一括削除
df_clean = df.drop(columns=["仕入価格", "内部ID", "更新日", "削除フラグ"])
print("削除後の列:", df_clean.columns.tolist())
print(df_clean)
# 出力結果:削除前の列: ['商品名', '価格', '仕入価格', '内部ID', '更新日', '削除フラグ']
# 出力結果:削除後の列: ['商品名', '価格']
# 商品名 価格
# 0 アボカド 298
# 1 サーモン 1200
# 2 ドラゴンフルーツ 498
columnsにリストを渡すことで複数の列を一度の呼び出しで削除できます。削除したい列が多い場合でもコードが簡潔にまとまります。
残したい列を指定して不要列を削除する
import pandas as pd
df = pd.DataFrame({
"商品名": ["キーボード", "マウス", "パソコン"],
"価格": [8500, 2000, 120000],
"仕入価格": [5000, 1200, 80000],
"内部メモ": ["確認済", "要確認", "確認済"],
"廃番": [False, False, False]
})
# 残したい列を指定してDataFrameを絞り込む(逆の発想)
keep_cols = ["商品名", "価格"]
df_clean = df[keep_cols]
print(df_clean)
# 出力結果:
# 商品名 価格
# 0 キーボード 8500
# 1 マウス 2000
# 2 パソコン 120000
削除する列が多く残す列が少ない場合は、残したい列をリストで指定してDataFrameを絞り込む方が効率的です。drop()で多数の列名を列挙するよりもシンプルなコードになります。
errors=’ignore’で存在しない列のエラーを回避する
import pandas as pd
df = pd.DataFrame({
"商品名": ["ゴリラ茶", "ロバコーヒー"],
"価格": [350, 420],
"在庫": [100, 80]
})
# 存在しない列名を指定するとKeyError
# df.drop(columns="存在しない列") # KeyError
# errors='ignore'でエラーを無視して削除を試みる
df_clean = df.drop(columns=["在庫", "存在しない列", "別の架空列"], errors="ignore")
print(df_clean)
# 出力結果:
# 商品名 価格
# 0 ゴリラ茶 350
# 1 ロバコーヒー 420
errors=’ignore’を指定すると、存在しない列名が含まれていてもエラーを発生させずに処理を続けます。列の存在チェックが難しい動的な処理や、複数のデータソースを扱う場合に便利なオプションです。
del文と列選択で列を削除する方法
続いては、del文を使った列削除と列選択による削除の方法を確認していきます。
drop()以外にも列を削除する方法があります。del文はインプレースで列を削除する最もシンプルな方法のひとつで、元のDataFrameを直接変更します。
del文で列を削除する
import pandas as pd
df = pd.DataFrame({
"商品名": ["ネジ", "ボルト", "ナット"],
"価格": [50, 120, 80],
"内部フラグ": [1, 0, 1],
"一時データ": ["a", "b", "c"]
})
print("削除前:", df.columns.tolist())
# del文で列を削除(インプレース)
del df["内部フラグ"]
del df["一時データ"]
print("削除後:", df.columns.tolist())
print(df)
# 出力結果:削除前: ['商品名', '価格', '内部フラグ', '一時データ']
# 出力結果:削除後: ['商品名', '価格']
# 商品名 価格
# 0 ネジ 50
# 1 ボルト 120
# 2 ナット 80
del文はPythonの組み込み構文で、インプレースで列を削除します。シンプルな記述ですが複数列をまとめて削除する場合は1列ずつ書く必要があります。
pop()で列を削除しながら値を取り出す
import pandas as pd
df = pd.DataFrame({
"商品名": ["アボカド", "サーモン", "ドラゴンフルーツ"],
"価格": [298, 1200, 498],
"ラベル": ["果物", "魚介", "果物"]
})
# pop()で列を削除しながらSeriesとして取り出す
label_series = df.pop("ラベル")
print("取り出した列:")
print(label_series)
print("残ったDataFrame:")
print(df)
# 出力結果:
# 取り出した列:
# 0 果物
# 1 魚介
# 2 果物
# Name: ラベル, dtype: object
# 残ったDataFrame:
# 商品名 価格
# 0 アボカド 298
# 1 サーモン 1200
# 2 ドラゴンフルーツ 498
pop()は列を削除しながらその列のSeriesを戻り値として返します。列を削除しつつその内容を別の処理に使いたい場面で便利なメソッドです。
列削除方法の比較表
| 方法 | 複数列対応 | 元dfへの影響 | 特徴 |
|---|---|---|---|
| drop(axis=1) | ○(リスト指定) | 変更されない | 最も汎用的・推奨 |
| drop(inplace=True) | ○(リスト指定) | 変更される | 直接変更したい場合 |
| del df[“列名”] | ×(1列ずつ) | 変更される | シンプルな記述 |
| df.pop(“列名”) | ×(1列ずつ) | 変更される | 削除しながら値を取得 |
| df[残す列リスト] | ○ | 変更されない | 残す列が少ない場合に有効 |
条件で列を絞り込んで削除する応用パターン
続いては、条件に基づいて削除する列を動的に決定する応用的なパターンを確認していきます。
実務では「名前が特定の文字で始まる列をすべて削除する」「欠損値が多い列を削除する」など、条件に応じて削除対象の列を動的に選定する処理が求められることがあります。
欠損値が多い列を削除する
import pandas as pd
import numpy as np
df = pd.DataFrame({
"商品名": ["アボカド", "サーモン", "ゴリラ茶", "ロバコーヒー"],
"価格": [298, 1200, 350, 420],
"産地": ["メキシコ", np.nan, "静岡", np.nan],
"備考": [np.nan, np.nan, np.nan, "新商品"]
})
print("削除前:")
print(df)
print("欠損値の割合:")
print(df.isnull().mean())
# 欠損値が50%以上の列を削除
threshold = 0.5
cols_to_drop = df.columns[df.isnull().mean() >= threshold].tolist()
print(f"削除対象列:{cols_to_drop}")
df_clean = df.drop(columns=cols_to_drop)
print(df_clean)
# 出力結果:削除対象列:['産地', '備考']
# 商品名 価格
# 0 アボカド 298
# 1 サーモン 1200
# 2 ゴリラ茶 350
# 3 ロバコーヒー 420
isnull().mean()で各列の欠損値の割合を計算し、閾値を超える列を動的に選んで削除するパターンです。大量のカラムを持つデータセットの前処理で特に役立ちます。
特定のプレフィックスを持つ列を削除する
import pandas as pd
df = pd.DataFrame({
"商品名": ["キーボード", "マウス"],
"価格": [8500, 2000],
"tmp_計算用": [1, 2],
"tmp_バックアップ": [3, 4],
"tmp_一時": [5, 6]
})
print("削除前の列:", df.columns.tolist())
# "tmp_"で始まる列をすべて削除
tmp_cols = [col for col in df.columns if col.startswith("tmp_")]
df_clean = df.drop(columns=tmp_cols)
print("削除後の列:", df_clean.columns.tolist())
print(df_clean)
# 出力結果:削除前の列: ['商品名', '価格', 'tmp_計算用', 'tmp_バックアップ', 'tmp_一時']
# 出力結果:削除後の列: ['商品名', '価格']
# 商品名 価格
# 0 キーボード 8500
# 1 マウス 2000
リスト内包表記でstartswith()を使うことで、特定のプレフィックスを持つ列名を動的に抽出して削除できます。一時計算用の列や内部管理用の列をまとめて除去する場面で使えるパターンです。
データ型で列を絞り込んで削除する
import pandas as pd
df = pd.DataFrame({
"商品名": ["ネジ", "ボルト", "ワッシャー"],
"価格": [50, 120, 30],
"在庫": [200, 150, 500],
"メモ": ["標準", "特注", "汎用"],
"タグ": ["部品", "部品", "部品"]
})
print("各列のデータ型:")
print(df.dtypes)
# object型(文字列型)の列のうち、数値列以外を削除
obj_cols = df.select_dtypes(include="object").columns.tolist()
# 商品名以外のobject型列を削除
cols_to_drop = [col for col in obj_cols if col != "商品名"]
df_clean = df.drop(columns=cols_to_drop)
print(df_clean)
# 出力結果:
# 商品名 価格 在庫
# 0 ネジ 50 200
# 1 ボルト 120 150
# 2 ワッシャー 30 500
select_dtypes()でデータ型を絞り込んでから列を選定するパターンです。機械学習のデータ前処理で数値列だけを残すといった処理に活用できます。
まとめ
この記事では、PythonのpandasでDataFrameの列を削除するさまざまな方法について、drop()の基本からdel文・pop()・条件による動的削除まで幅広く解説しました。
列削除の基本はdrop(columns=”列名”, axis=1)で、複数列の削除はリストを渡すことで一括対応できます。元のDataFrameを変更したい場合はinplace=Trueを指定しましょう。残す列が少ない場合はdf[残す列リスト]で絞り込む方が効率的です。
欠損値の割合による削除・プレフィックスによる動的選定・データ型による絞り込みなど、条件を活用した列削除パターンは実際のデータ前処理で非常に役立ちます。今回紹介した方法をベースに、実際のデータ分析で活用してみてください。