データ分析の現場において、PythonのライブラリであるPandas(パンダス)は欠かせないツールとなっています。
特にDataFrame(データフレーム)の列操作は、データの前処理や特徴量エンジンの構築において最も頻繁に行われる作業の一つです。
本記事では、2026年時点での最新のベストプラクティスを踏まえ、Pandasで列を追加・削除する効率的な手法を網羅的に解説します。
実務で即座に活用できるコード例と共に、各メソッドの挙動や使い分けのポイントを詳しく見ていきましょう。
Pandasにおける列操作の基本準備
まずは、解説に使用するためのサンプルデータを作成します。
Pandasをインポートし、数行のデータを持つDataFrameを定義しましょう。
import pandas as pd
import numpy as np
# サンプルデータの作成
df = pd.DataFrame({
'名前': ['田中', '佐藤', '鈴木', '高橋'],
'年齢': [25, 32, 28, 45],
'部署': ['営業', '総務', '開発', '営業']
})
print(df)
名前 年齢 部署
0 田中 25 営業
1 佐藤 32 総務
2 鈴木 28 開発
3 高橋 45 営業
この基本的なDataFrameを元に、様々な列操作の手法を解説していきます。
DataFrameに列を追加する主要な手法
列の追加には、単純な代入から特定のメソッドを使用する方法まで、複数のアプローチが存在します。
最もシンプルな「ブラケット参照」による追加
最も直感的で頻繁に使われるのが、ブラケット([])を使用した代入です。
既存のDataFrameに新しい列名を指定し、値を代入するだけで完了します。
# 'エリア'という列を追加
df['エリア'] = '東京'
print(df)
名前 年齢 部署 エリア
0 田中 25 営業 東京
1 佐藤 32 総務 東京
2 鈴木 28 開発 東京
3 高橋 45 営業 東京
この方法は非常に簡潔ですが、元のDataFrameが直接書き換えられる点に注意が必要です。
また、既存の列を演算して新しい列を作成する場合にも適しています。
# 年齢に5を加算した'5年後の年齢'列を追加
df['5年後の年齢'] = df['年齢'] + 5
print(df)
名前 年齢 部署 エリア 5年後の年齢
0 田中 25 営業 東京 30
1 佐藤 32 総務 東京 37
2 鈴木 28 開発 東京 33
3 高橋 45 営業 東京 50
メソッドチェーンに便利な「assignメソッド」
assignメソッドを使用すると、元のデータを変更せずに新しいDataFrameを返すことができます。
これは、複数の処理を数珠つなぎで行うメソッドチェーンにおいて非常に強力です。
# assignを使用して新しい列を追加(元のdfは変更されない)
new_df = df.assign(
ボーナス = [100, 200, 150, 300],
ステータス = '正社員'
)
print(new_df)
名前 年齢 部署 エリア 5年後の年齢 ボーナス ステータス
0 田中 25 営業 東京 30 100 正社員
1 佐藤 32 総務 東京 37 200 正社員
2 鈴木 28 開発 東京 33 150 正社員
3 高橋 45 営業 東京 50 300 正社員
assignメソッド内ではラムダ式(lambda)を使用することも可能です。
ラムダ式を使うことで、その場で計算した結果を新しい列として追加できます。
# ラムダ式を用いた列の追加
new_df = df.assign(
若手フラグ = lambda x: x['年齢'] < 30
)
print(new_df)
挿入位置を指定できる「insertメソッド」
通常、新しい列はDataFrameの右端に追加されます。
しかし、特定の列の間に挿入したい場合は、insertメソッドを使用します。
# 1番目(0から数えて)のインデックスに'ID'列を挿入
df.insert(1, 'ID', [101, 102, 103, 104])
print(df)
名前 ID 年齢 部署 エリア 5年後の年齢
0 田中 101 25 営業 東京 30
1 佐藤 102 32 総務 東京 37
2 鈴木 103 28 開発 東京 33
3 高橋 104 45 営業 東京 50
insertメソッドは破壊的なメソッドであり、元のDataFrameを直接変更します。
条件に基づいて追加する「locプロパティ」
特定の条件を満たす行に対してのみ、新しい列の値を設定したい場合にはlocを使用します。
条件に合致しない行には、デフォルトでNaN(欠損値)が入ります。
# 年齢が30歳以上の場合に'役職'列に'リーダー'を設定
df.loc[df['年齢'] >= 30, '役職'] = 'リーダー'
print(df)
名前 ID 年齢 部署 エリア 5年後の年齢 役職
0 田中 101 25 営業 東京 30 NaN
1 佐藤 102 32 総務 東京 37 リーダー
2 鈴木 103 28 開発 東京 33 NaN
3 高橋 104 45 営業 東京 50 リーダー
DataFrameから列を削除する主要な手法
不要なデータを取り除く列の削除も、追加と同様に重要です。
最も汎用的な「dropメソッド」
Pandasで列を削除する際に最も一般的に使われるのが、dropメソッドです。
columns引数に削除したい列名を指定するか、axis=1を指定することで列を削除できます。
# 'エリア'列を削除
df_dropped = df.drop(columns=['エリア'])
print(df_dropped)
複数の列を一度に削除する場合は、リスト形式で列名を指定します。
# 複数の列を削除
df_dropped_multi = df.drop(columns=['5年後の年齢', 'ID'])
print(df_dropped_multi)
実務では、元のDataFrameを変更せずに削除後のコピーを作成することが推奨されます。
もし元のオブジェクトを直接更新したい場合は、inplace=Trueを指定することも可能ですが、近年のPandasでは非推奨の流れにあるため、再代入による更新が主流です。
列を取り出しつつ削除する「popメソッド」
popメソッドを使用すると、特定の列をDataFrameから削除し、その削除された列(Series)を変数として取得できます。
# '役職'列を削除し、内容を取得
yaku_series = df.pop('役職')
print(df.columns)
print(yaku_series)
特定の列を別の計算に使いつつ、元のDataFrameからは消し去りたい場合に便利です。
Python標準の「del文」による削除
Pythonの標準機能であるdel文を使用して列を削除することもできます。
# 'エリア'列を完全に削除
del df['エリア']
この方法は非常に高速ですが、DataFrameをインプレースで書き換えるため、注意して使用する必要があります。
実務で役立つ列操作のTips
基本的な追加・削除をマスターした後は、実務で遭遇する複雑なシチュエーションへの対応策を知っておくと役立ちます。
列名の変更と削除を同時に行う
データクレンジングの際、列を削除するだけでなく、残った列の名前を整理したいことがあります。
そのような場合は、メソッドチェーンを活用して一連の処理をまとめるとコードの可読性が向上します。
# 削除とリネームを同時に行う例
cleaned_df = (
df.drop(columns=['ID'])
.rename(columns={'部署': '所属セクション'})
)
存在しない列の削除でエラーを回避する
dropメソッドを使用する際、指定した列が存在しないとエラーが発生します。
これを防ぐには、errors='ignore'オプションを指定します。
# 存在しない列を指定してもエラーにならない
df.drop(columns=['不明な列'], errors='ignore')
この設定により、列が存在する場合のみ削除され、存在しない場合は何も行われずに処理が継続されます。
特定のデータ型を持つ列を一括で削除する
例えば、数値データのみを残して文字列の列をすべて削除したい場合があります。
このような場合はselect_dtypesを活用します。
# 数値列(intやfloat)のみを抽出(=それ以外を削除)
numeric_df = df.select_dtypes(include=['number'])
print(numeric_df)
列操作におけるパフォーマンスとメモリの最適化
データサイズが大きくなると、列の追加や削除の方法がパフォーマンスに影響を与えるようになります。
コピー・オン・ライト(Copy-on-Write)の意識
2026年現在のPandas(バージョン3.0以降が普及している環境)では、「Copy-on-Write(CoW)」機能がデフォルトで有効になっています。
これにより、不要なデータのコピーが発生しにくくなり、メモリ効率が向上しています。
ブラケット代入よりも、assignメソッドなどを使用して新しいDataFrameを生成する手法が、CoWの仕組みと相性が良く、安全なコード作成に繋がります。
大量の列を一度に追加する場合のコツ
ループ内でdf['new_col'] = valueを繰り返すと、ループのたびに内部的な処理が走り、速度が低下する可能性があります。
大量の列を追加する場合は、まず辞書形式で新しいデータをまとめ、最後に一括でDataFrame化して結合(concat)するか、assignでまとめて追加するのが効率的です。
列操作メソッドの比較まとめ
今回紹介した主な列操作メソッドの特徴を、以下の表にまとめました。
| 操作 | メソッド/文法 | 特徴 |
|---|---|---|
| 追加 | df['列名'] = 値 | 最も一般的で簡潔。直接変更。 |
| 追加 | df.assign() | 非破壊的。メソッドチェーンに最適。 |
| 追加 | df.insert() | 挿入位置(列番号)を指定可能。 |
| 削除 | df.drop() | 複数列の一括削除が可能。エラー回避も。 |
| 削除 | df.pop() | 削除と同時に値を取得。破壊的。 |
| 削除 | del df['列名'] | Python標準文法。インプレースで高速。 |
まとめ
Pandasでの列追加・削除は、データ分析フローにおいて避けては通れない操作です。
基本的には、直感的に列を追加したい場合は「ブラケット代入」、処理を繋げたい場合や非破壊的な操作を好む場合は「assign」、柔軟な削除を行いたい場合は「drop」を選択するのがベストです。
特に近年のPandasにおけるメモリ管理の進化(Copy-on-Write)を意識することで、より堅牢で高速なデータ処理パイプラインを構築できるようになります。
本記事で紹介したコード例を参考に、ご自身のプロジェクトでも効率的なデータ操作を実践してみてください。
適切なメソッドを選択することで、コードの可読性は向上し、バグの少ないクリーンなデータ分析が可能になるはずです。
