Pythonのデータ分析でpandasを使っていると、既存のDataFrameに新しい列を追加したい場面は頻繁に出てきます。計算結果の列を追加する、外部データを結合する、条件に応じた新規カラムを作成するなど、DataFrameへの列追加はpandasを使ったデータ処理の基本操作のひとつです。
pandasにはDataFrameに列を追加する方法が複数あります。直接代入する方法・assign()メソッド・insert()メソッドなど、追加する位置や用途によって使い分けることで、より効率的なデータ処理が可能になります。
この記事では、PythonでDataFrameに列を追加するさまざまな方法を、サンプルコードとともにわかりやすく解説していきます。基本的な代入方法から条件付きの列追加・apply()を使った応用まで幅広くカバーしていますので、ぜひ参考にしてください。
PythonでDataFrameに列を追加するには直接代入が最もシンプルな方法
それではまず、pandasのDataFrameに列を追加する最も基本的な方法について解説していきます。
DataFrameに新しい列を追加する最もシンプルな方法が、「df[“新しい列名”] = 値」という直接代入の書き方です。辞書に新しいキーを追加するのと同じような感覚で使えます。
import pandas as pd
# サンプルDataFrameを作成
df = pd.DataFrame({
"商品名": ["アボカド", "ドラゴンフルーツ", "サーモン", "ゴリラ茶"],
"価格": [298, 498, 1200, 350],
"在庫数": [50, 30, 20, 100]
})
print(df)
# 新しい列を直接代入で追加
df["合計金額"] = df["価格"] * df["在庫数"]
print(df)
# 出力結果:
# 商品名 価格 在庫数
# 0 アボカド 298 50
# 1 ドラゴンフルーツ 498 30
# 2 サーモン 1200 20
# 3 ゴリラ茶 350 100
# 出力結果(列追加後):
# 商品名 価格 在庫数 合計金額
# 0 アボカド 298 50 14900
# 1 ドラゴンフルーツ 498 30 14940
# 2 サーモン 1200 20 24000
# 3 ゴリラ茶 350 100 35000
df[“合計金額”] = df[“価格”] * df[“在庫数”]のように、既存の列を使った計算結果を新しい列として追加できます。追加した列はDataFrameの末尾に配置されます。
固定値・リスト・Seriesで列を追加する方法
追加する値の形式によって、いくつかのパターンがあります。
import pandas as pd
df = pd.DataFrame({
"商品名": ["キーボード", "マウス", "モニター", "パソコン"],
"価格": [8500, 2000, 35000, 120000]
})
# パターン1:固定値で全行に同じ値を設定
df["カテゴリ"] = "周辺機器"
# パターン2:リストで各行に値を設定
df["評価"] = [4.5, 3.8, 4.2, 4.9]
# パターン3:Seriesで追加
tax = pd.Series([850, 200, 3500, 12000], name="消費税")
df["消費税"] = tax
print(df)
# 出力結果:
# 商品名 価格 カテゴリ 評価 消費税
# 0 キーボード 8500 周辺機器 4.5 850
# 1 マウス 2000 周辺機器 3.8 200
# 2 モニター 35000 周辺機器 4.2 3500
# 3 パソコン 120000 周辺機器 4.9 12000
固定値を指定するとすべての行に同じ値が入ります。リストを指定するときは行数と要素数が一致している必要があります。
列名を確認してから追加する
import pandas as pd
df = pd.DataFrame({
"商品名": ["ネジ", "ボルト", "ナット"],
"価格": [50, 120, 80]
})
# 既存の列名を確認
print(f"既存の列:{df.columns.tolist()}")
# 追加したい列名が既に存在するか確認
new_col = "在庫数"
if new_col not in df.columns:
df[new_col] = [200, 150, 300]
print(f"「{new_col}」列を追加しました。")
else:
print(f"「{new_col}」列は既に存在します。")
print(df)
# 出力結果:既存の列:['商品名', '価格']
# 出力結果:「在庫数」列を追加しました。
# 商品名 価格 在庫数
# 0 ネジ 50 200
# 1 ボルト 120 150
# 2 ナット 80 300
df.columnsで既存の列名を確認してから追加することで、誤った上書きを防げます。データ処理の安全性を高める習慣として覚えておきましょう。
assign()メソッドで列を追加する方法
続いては、assign()メソッドを使ってDataFrameに列を追加する方法を確認していきます。
assign()はDataFrameのメソッドで、元のDataFrameを変更せずに新しい列を追加した新しいDataFrameを返します。メソッドチェーンを使ったコードとの相性が良く、よりPythonicな書き方ができます。
assign()の基本的な使い方
import pandas as pd
df = pd.DataFrame({
"商品名": ["アボカド", "サーモン", "ドラゴンフルーツ"],
"価格": [298, 1200, 498],
"個数": [10, 5, 8]
})
# assign()で新しい列を追加(元のdfは変更されない)
df_new = df.assign(合計=df["価格"] * df["個数"])
print(df_new)
# ラムダ式を使う書き方
df_new2 = df.assign(合計=lambda x: x["価格"] * x["個数"])
print(df_new2)
# 出力結果:
# 商品名 価格 個数 合計
# 0 アボカド 298 10 2980
# 1 サーモン 1200 5 6000
# 2 ドラゴンフルーツ 498 8 3984
assign()はラムダ式と組み合わせることで、DataFrameの内容を参照しながら新しい列を定義できます。元のdfが変更されないため、処理前後の比較が必要な場面でも安心して使えます。
assign()で複数の列を同時に追加する
import pandas as pd
df = pd.DataFrame({
"商品名": ["キーボード", "マウス", "モニター"],
"税抜価格": [8500, 2000, 35000]
})
# assign()で複数列を同時に追加
df_new = df.assign(
消費税=lambda x: (x["税抜価格"] * 0.1).astype(int),
税込価格=lambda x: (x["税抜価格"] * 1.1).astype(int),
カテゴリ="PC周辺機器"
)
print(df_new)
# 出力結果:
# 商品名 税抜価格 消費税 税込価格 カテゴリ
# 0 キーボード 8500 850 9350 PC周辺機器
# 1 マウス 2000 200 2200 PC周辺機器
# 2 モニター 35000 3500 38500 PC周辺機器
assign()のキーワード引数に複数の列を定義することで、一度の呼び出しで複数の列をまとめて追加できます。コードがすっきりして読みやすくなるでしょう。
メソッドチェーンでassign()を活用する
import pandas as pd
df = pd.DataFrame({
"商品名": ["ネジ", "ボルト", "ワッシャー", "ナット"],
"単価": [50, 120, 30, 80],
"個数": [200, 150, 500, 300]
})
# メソッドチェーンでフィルタリングと列追加を組み合わせる
result = (
df
.assign(合計=lambda x: x["単価"] * x["個数"])
.assign(ランク=lambda x: x["合計"].apply(lambda v: "高" if v >= 20000 else "低"))
.sort_values("合計", ascending=False)
)
print(result)
# 出力結果:
# 商品名 単価 個数 合計 ランク
# 2 ワッシャー 30 500 15000 低
# 3 ナット 80 300 24000 高
# 1 ボルト 120 150 18000 低
# 0 ネジ 50 200 10000 低
assign()を連鎖させることで、データ変換の流れを1つのパイプラインとして表現できます。可読性が高く、処理の意図が伝わりやすいコードになります。
insert()メソッドで任意の位置に列を追加する方法
続いては、insert()メソッドを使ってDataFrameの任意の位置に列を追加する方法を確認していきます。
直接代入やassign()では列はDataFrameの末尾に追加されますが、insert()メソッドを使うと任意の位置に列を挿入できます。先頭に追加したい、特定の列の隣に配置したいといった場合に役立ちます。
insert()の基本的な使い方
import pandas as pd
df = pd.DataFrame({
"商品名": ["アボカド", "サーモン", "ゴリラ茶"],
"価格": [298, 1200, 350],
"在庫": [50, 20, 100]
})
print("追加前:")
print(df)
# insert(位置, 列名, 値)で任意の位置に追加
# 0番目(先頭)にID列を追加
df.insert(0, "ID", [1, 2, 3])
# 2番目(価格の右隣)に税込価格を追加
df.insert(2, "税込価格", (df["価格"] * 1.1).astype(int))
print("追加後:")
print(df)
# 出力結果(追加後):
# ID 商品名 価格 税込価格 在庫
# 0 1 アボカド 298 327 50
# 1 2 サーモン 1200 1320 20
# 2 3 ゴリラ茶 350 385 100
insert()の第1引数に挿入する位置(0始まりのインデックス)、第2引数に列名、第3引数に値を指定します。IDや連番を先頭に追加したい場合などに特に便利です。
先頭に連番IDを追加する
import pandas as pd
df = pd.DataFrame({
"商品名": ["キーボード", "マウス", "パソコン", "モニター"],
"価格": [8500, 2000, 120000, 35000]
})
# 先頭に連番IDを追加
df.insert(0, "ID", range(1, len(df) + 1))
# 先頭にUUIDを追加する例
import uuid
df.insert(1, "UUID", [str(uuid.uuid4())[:8] for _ in range(len(df))])
print(df)
# 出力結果:
# ID UUID 商品名 価格
# 0 1 a3f8b2c1 キーボード 8500
# 1 2 d4e5f6a7 マウス 2000
# 2 3 b8c9d0e1 パソコン 120000
# 3 4 f2a3b4c5 モニター 35000
range()とlen()を組み合わせることで、行数に応じた連番を自動生成して先頭列として追加できます。
列の位置を指定した追加パターンの比較
| 方法 | 追加位置 | 元dfへの影響 | 用途 |
|---|---|---|---|
| 直接代入 df[“列”] = 値 | 末尾 | 変更される | シンプルな列追加 |
| assign() | 末尾 | 変更されない | メソッドチェーン・複数列追加 |
| insert() | 任意の位置 | 変更される | 先頭・特定位置への挿入 |
条件付き・apply()を使った高度な列追加方法
続いては、条件分岐やapply()を使ってより柔軟に列を追加する応用的な方法を確認していきます。
実際のデータ処理では、単純な計算だけでなく条件に応じた値を持つ列や、複雑なロジックを適用した列を追加する場面が多くあります。
np.whereで条件付きの列を追加する
import pandas as pd
import numpy as np
df = pd.DataFrame({
"商品名": ["アボカド", "ドラゴンフルーツ", "サーモン", "ネジ", "ボルト"],
"価格": [298, 498, 1200, 50, 120],
"在庫数": [50, 30, 5, 500, 200]
})
# np.whereで条件付きの列を追加
df["価格帯"] = np.where(df["価格"] >= 500, "高価格", "低価格")
df["在庫状況"] = np.where(df["在庫数"] >= 50, "在庫あり", "在庫少")
print(df)
# 出力結果:
# 商品名 価格 在庫数 価格帯 在庫状況
# 0 アボカド 298 50 低価格 在庫あり
# 1 ドラゴンフルーツ 498 30 低価格 在庫少
# 2 サーモン 1200 5 高価格 在庫少
# 3 ネジ 50 500 低価格 在庫あり
# 4 ボルト 120 200 低価格 在庫あり
np.where(条件, 真の値, 偽の値)はExcelのIF関数に相当します。シンプルな2択の条件分岐なら最もスッキリ書けるパターンです。
apply()で複雑なロジックの列を追加する
import pandas as pd
df = pd.DataFrame({
"商品名": ["キーボード", "マウス", "パソコン", "モニター", "ネジ"],
"価格": [8500, 2000, 120000, 35000, 50],
"評価": [4.5, 3.2, 4.8, 4.1, 3.9]
})
# apply()で複雑な条件のランク列を追加
def get_rank(row):
if row["価格"] >= 100000 and row["評価"] >= 4.5:
return "プレミアム"
elif row["価格"] >= 10000:
return "スタンダード"
elif row["評価"] >= 4.0:
return "おすすめ"
else:
return "エントリー"
df["ランク"] = df.apply(get_rank, axis=1)
print(df)
# 出力結果:
# 商品名 価格 評価 ランク
# 0 キーボード 8500 4.5 おすすめ
# 1 マウス 2000 3.2 エントリー
# 2 パソコン 120000 4.8 プレミアム
# 3 モニター 35000 4.1 スタンダード
# 4 ネジ 50 3.9 エントリー
apply()とaxis=1を使うことで、各行を関数に渡して処理できます。複数の列の値を組み合わせた複雑なロジックで新しい列を作りたい場合に最適です。
pd.cut()で数値を区間に分けて列を追加する
import pandas as pd
df = pd.DataFrame({
"商品名": ["アボカド", "サーモン", "ドラゴンフルーツ", "パソコン", "ネジ"],
"価格": [298, 1200, 498, 120000, 50]
})
# pd.cut()で価格帯のカテゴリ列を追加
bins = [0, 100, 1000, 10000, float("inf")]
labels = ["超低価格", "低価格", "中価格", "高価格"]
df["価格カテゴリ"] = pd.cut(df["価格"], bins=bins, labels=labels)
print(df)
# 出力結果:
# 商品名 価格 価格カテゴリ
# 0 アボカド 298 低価格
# 1 サーモン 1200 中価格
# 2 ドラゴンフルーツ 498 低価格
# 3 パソコン 120000 高価格
# 4 ネジ 50 超低価格
pd.cut()は数値を指定した区間(ビン)に分類してカテゴリ変数にするメソッドです。価格帯・年齢層・スコア区分など、数値をグループに分けたい場面で非常に便利でしょう。
まとめ
この記事では、PythonのpandasでDataFrameに列を追加するさまざまな方法について、直接代入・assign()・insert()・apply()・np.whereなどをサンプルコードとともに解説しました。
シンプルな列追加には直接代入が最も手軽です。元のDataFrameを変更せずに処理したい場合やメソッドチェーンを使う場合はassign()が適しています。先頭や特定位置に挿入したい場合はinsert()を、複雑な条件ロジックにはapply()やnp.whereを使い分けましょう。
DataFrameへの列追加はデータ前処理の中心的な操作です。今回紹介したパターンをベースに、実際のデータ分析プロジェクトでどんどん活用してみてください。