Pandas DataFrameの行・列を削除!drop()メソッドでデータを整理 🗑️
データ分析の過程で、不要な情報や特定の条件を満たす行・列をDataFrameから削除する必要は頻繁に発生します。例えば、重複データ、欠損値が多い列、または分析対象外の特定のカテゴリの行などを整理したい場合です。Pandasの**drop()メソッド**は、この削除操作を柔軟かつ強力に行うための主要なツールです。
この記事では、drop()メソッドの基本的な使い方から、行や列を削除する際の指定方法、そして元のDataFrameへの影響(非破壊的 vs 破壊的)について、具体的なコード例を交えながら詳しく解説します。
drop()メソッドの基本:行・列の削除 ✂️
drop()メソッドは、指定したラベル(行名または列名)に基づいて、DataFrameから行や列を削除します。デフォルトでは、削除された新しいDataFrameが返され、元のDataFrameは変更されません(非破壊的)。
1. 列を削除する (axis=1)
列を削除する場合、columns引数に削除したい列名を指定するか、labels引数に列名を指定しaxis=1(またはaxis='columns')を指定します。
import pandas as pd
df = pd.DataFrame({
'ID': [1, 2, 3],
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120],
'在庫数': [50, 120, 30]
})
print("--- 元のDataFrame ---")
print(df)
# '在庫数'列を削除 (新しいDataFrameが返される)
df_no_stock = df.drop(columns='在庫数')
# または df.drop('在庫数', axis=1)
print("\n--- '在庫数'列を削除後のDataFrame ---")
print(df_no_stock)
# 複数の列を削除
df_no_price_id = df.drop(columns=['ID', '価格'])
print("\n--- 'ID'と'価格'列を削除後のDataFrame ---")
print(df_no_price_id)
2. 行を削除する (axis=0)
行を削除する場合、index引数に削除したい行インデックス(ラベル)を指定するか、labels引数に行インデックスを指定しaxis=0(またはaxis='index')を指定します。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120]
}, index=['A', 'B', 'C']) # カスタムインデックス
print("--- 元のDataFrame ---")
print(df)
# インデックス'B'の行を削除
df_no_B = df.drop(index='B')
# または df.drop('B', axis=0)
print("\n--- インデックス'B'の行を削除後のDataFrame ---")
print(df_no_B)
# 複数の行を削除
df_no_AC = df.drop(index=['A', 'C'])
print("\n--- インデックス'A'と'C'の行を削除後のDataFrame ---")
print(df_no_AC)
drop()の便利なオプション 🛠️
drop()メソッドには、さらに柔軟な削除を可能にするいくつかの重要なオプションがあります。
1. inplace=True:元のDataFrameを直接変更(破壊的) 💥
デフォルトではdrop()は新しいDataFrameを返しますが、inplace=Trueを設定すると、元のDataFrameが直接変更されます。これにより、新しい変数を割り当てる手間が省けますが、元のデータが失われるため注意が必要です。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん'],
'価格': [100, 80]
})
print("--- 削除前のDataFrame ---")
print(df)
# '価格'列をinplaceで削除
df.drop(columns='価格', inplace=True)
print("\n--- '価格'列をinplaceで削除後のDataFrame ---")
print(df)
# 元のdfが変更されている
注意: inplace=Trueを使用すると、元のDataFrameは復元できません。特に大規模なデータセットや重要なデータでは、予期せぬ変更を防ぐために、まずはinplace=False(デフォルト)で新しいDataFrameを作成し、結果を確認することをお勧めします。
2. errors='ignore':存在しないラベルを無視 🤫
削除しようとする列名や行インデックスが存在しない場合、デフォルトではエラーが発生します。errors='ignore'を設定すると、存在しないラベルは無視され、エラーは発生しません。
import pandas as pd
df = pd.DataFrame({'A': [1], 'B': [2]})
# 存在しない列'C'を削除しようとするとデフォルトではエラー
# df.drop(columns='C') # KeyError: "['C'] not found in axis"
# errors='ignore' を使用するとエラーにならない
df_safe_drop = df.drop(columns='C', errors='ignore')
print("\n--- 存在しない列をignoreで削除(エラーなし) ---")
print(df_safe_drop)
3. 数値インデックスを使って行を削除する
drop()は基本的にラベルベースですが、デフォルトの数値インデックスを持つDataFrameでも、その数値を行ラベルとして使用して行を削除できます。
import pandas as pd
df = pd.DataFrame({
'データ': [10, 20, 30, 40]
}) # デフォルトの数値インデックス (0, 1, 2, 3)
print("--- 元のDataFrame ---")
print(df)
# インデックス1と3の行を削除
df_filtered_rows = df.drop(index=[1, 3])
print("\n--- インデックス1と3の行を削除後のDataFrame ---")
print(df_filtered_rows)
まとめ:drop()の使い分け 💡
-
列を削除:
df.drop(columns='列名')またはdf.drop(['列名1', '列名2'], axis=1) -
行を削除:
df.drop(index='行インデックス')またはdf.drop(['行インデックス1', '行インデックス2'], axis=0) -
元のDataFrameを変更:
inplace=Trueを指定 (注意が必要) -
存在しないラベルを無視:
errors='ignore'を指定
drop()メソッドは、データセットをクリーンアップし、必要な情報だけを抽出するための強力な基盤となります。これらの機能を適切に使いこなすことで、Pandasでのデータ前処理がより効率的かつ安全になるでしょう。ぜひ様々なデータを試して、この削除テクニックをマスターしてください!

