プログラミング

PythonでDataFrameに列を追加するには?pandasの使い方も!(列追加:カラム追加:新規列:pandas:代入方法など)

当サイトでは記事内に広告を含みます

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の末尾に配置されます。

直接代入でDataFrameに列を追加する場合、列名が既に存在していると上書きになります。新規追加なのか上書きなのかを意識して使いましょう。既存の列を誤って上書きしないよう、追加前にdf.columnsで列名を確認する習慣をつけると安全です。

固定値・リスト・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への列追加はデータ前処理の中心的な操作です。今回紹介したパターンをベースに、実際のデータ分析プロジェクトでどんどん活用してみてください。

pandasでDataFrameに列を追加する際、直接代入とinsert()は元のDataFrameを変更しますが、assign()は新しいDataFrameを返します。元データを保持したいときはassign()を使い、処理結果を別変数に代入する習慣をつけることで、誤ったデータ書き換えを防げます。