Pandas DataFrameに行や列を追加する方法|appendを使わない最新の書き方を解説

Pythonでデータ分析を行う際、表形式のデータを扱うために便利なのがpandasのDataFrameです。

DataFrameを操作していると、

  • DataFrameに新しい列を追加したい

  • DataFrameに新しい行を追加したい

  • 複数の列をまとめて追加したい

  • 条件に応じて列を追加したい

  • 別のDataFrameを結合して行を追加したい

  • append()が使えなくなった理由を知りたい

といった場面が出てきます。

本記事では、Pandas DataFrameに行や列を追加する方法を初心者向けに詳しく解説します。


Pandas DataFrameに列を追加する基本

DataFrameに列を追加する場合、最も基本的な方法は次の書き方です。

df["新しい列"] = 値

例えば、次のDataFrameを用意します。

import pandas as pd

df = pd.DataFrame({
    "名前": ["田中", "佐藤", "鈴木"],
    "年齢": [20, 30, 40]
})

print(df)

実行結果:

   名前  年齢
0  田中  20
1  佐藤  30
2  鈴木  40

ここに「職業」という列を追加します。

df["職業"] = ["会社員", "エンジニア", "教師"]

print(df)

実行結果:

   名前  年齢       職業
0  田中  20      会社員
1  佐藤  30  エンジニア
2  鈴木  40       教師

このように、

df["列名"] = データ

とするだけで新しい列を追加できます。


DataFrameに同じ値の列を追加する

すべての行に同じ値を設定する場合は、単純に値を指定できます。

df["国籍"] = "日本"

結果:

   名前  年齢       職業  国籍
0  田中  20      会社員  日本
1  佐藤  30  エンジニア  日本
2  鈴木  40       教師  日本

特定の条件に関係なく、DataFrameのすべての行に同じ値を設定したい場合に便利です。


DataFrameに計算結果の列を追加する

DataFrameでは、既存の列を使って新しい列を作ることもできます。

例えば、「年齢」に10を足した値を「10年後の年齢」として追加します。

df["10年後の年齢"] = df["年齢"] + 10

結果:

   名前  年齢       職業  国籍  10年後の年齢
0  田中  20      会社員  日本         30
1  佐藤  30  エンジニア  日本         40
2  鈴木  40       教師  日本         50

この方法は、データ分析では非常によく使います。

例えば、

df["売上"] = df["単価"] * df["数量"]

のように、複数の列から計算した結果を新しい列として追加できます。


条件に応じてDataFrameに列を追加する

条件によって異なる値を設定したい場合は、numpy.where()などを利用できます。

例えば、年齢が30歳以上なら「30代以上」、それ以外なら「30歳未満」とします。

import numpy as np

df["区分"] = np.where(
    df["年齢"] >= 30,
    "30歳以上",
    "30歳未満"
)

このように、条件に応じて新しい列を作成できます。


DataFrameの特定の位置に列を追加する

単純に、

df["列名"] = データ

とすると、新しい列は基本的にDataFrameの最後に追加されます。

特定の位置に追加したい場合は、insert()を使います。

df.insert(1, "新しい列", ["A", "B", "C"])

構文は次のとおりです。

df.insert(位置, "列名", データ)

例えば、

df.insert(1, "性別", ["男", "女", "男"])

とすると、インデックス1の位置に「性別」列が追加されます。


複数の列を追加する方法

複数の列を一度に追加する場合は、複数列を指定できます。

df[["住所", "電話番号"]] = [
    ["東京都", "090-1111-1111"],
    ["大阪府", "090-2222-2222"],
    ["愛知県", "090-3333-3333"]
]

また、assign()を使う方法もあります。

df = df.assign(
    都道府県=["東京", "大阪", "愛知"],
    区分=["A", "B", "C"]
)

assign()は、DataFrameを加工した結果を新しいDataFrameとして受け取りたい場合にも便利です。


Pandas DataFrameに行を追加する方法

次に、DataFrameへ行を追加する方法を見ていきましょう。

現在のpandasでは、過去によく使われていたDataFrame.append()は非推奨となり、現在のpandasでは利用できません。

そのため、行を追加する場合は基本的に**pd.concat()を使用します**。


DataFrameに1行追加する

例えば、次のDataFrameがあるとします。

df = pd.DataFrame({
    "名前": ["田中", "佐藤"],
    "年齢": [20, 30]
})

ここに「鈴木・40歳」の行を追加します。

まず追加するDataFrameを作ります。

new_row = pd.DataFrame({
    "名前": ["鈴木"],
    "年齢": [40]
})

そしてpd.concat()を使用します。

df = pd.concat([df, new_row], ignore_index=True)

結果:

   名前  年齢
0  田中  20
1  佐藤  30
2  鈴木  40

ignore_index=Trueを指定すると、インデックスを0から振り直すことができます。


複数行を追加する

複数の行を追加する場合もpd.concat()を使います。

new_rows = pd.DataFrame({
    "名前": ["鈴木", "高橋"],
    "年齢": [40, 50]
})

df = pd.concat([df, new_rows], ignore_index=True)

結果:

   名前  年齢
0  田中  20
1  佐藤  30
2  鈴木  40
3  高橋  50

複数行を追加する場合、こちらの方法が効率的です。


DataFrame同士を結合して行を追加する

2つのDataFrameを縦方向に結合する場合もpd.concat()を使用します。

df1 = pd.DataFrame({
    "名前": ["田中", "佐藤"],
    "年齢": [20, 30]
})

df2 = pd.DataFrame({
    "名前": ["鈴木", "高橋"],
    "年齢": [40, 50]
})

df = pd.concat([df1, df2], ignore_index=True)

結果:

   名前  年齢
0  田中  20
1  佐藤  30
2  鈴木  40
3  高橋  50

DataFrameを縦方向に連結すると、行を追加するような動作になります。


DataFrameを横方向に結合する

pd.concat()では、DataFrameを横方向に結合することもできます。

df = pd.concat([df1, df2], axis=1)

axis=1を指定すると、列方向に結合します。

一方、

pd.concat([df1, df2], axis=0)

では、行方向に結合します。

つまり、

設定 結合方向
axis=0 行方向
axis=1 列方向

と覚えておくとよいでしょう。


append()ではなくconcat()を使う

以前のpandasでは、次のようなコードが使われていました。

df = df.append(new_row)

しかし、DataFrame.append()はpandas 1.4系で非推奨となり、pandas 2.0で削除されました。

現在は、

df = pd.concat([df, new_row], ignore_index=True)

と書くのが基本です。

古い記事やプログラムを見て、

df.append(...)

が出てきた場合は注意しましょう。


DataFrameに行を追加するときの注意点

行を追加するときは、列名を意識する必要があります。

例えば、

df = pd.DataFrame({
    "名前": ["田中"],
    "年齢": [20]
})

new_row = pd.DataFrame({
    "名前": ["佐藤"],
    "住所": ["東京都"]
})

df = pd.concat([df, new_row], ignore_index=True)

とすると、「年齢」と「住所」の列が一致しないため、欠損値が発生します。

結果は、

   名前    年齢   住所
0  田中  20.0  NaN
1  佐藤   NaN  東京都

となります。

DataFrameを結合するときは、列名が一致しているかを確認しましょう。


locを使って行を追加する方法

単純なケースでは、locを使って行を追加することもできます。

df.loc[len(df)] = ["鈴木", 40]

結果:

   名前  年齢
0  田中  20
1  佐藤  30
2  鈴木  40

この方法は、1行だけ追加したい場合にはシンプルです。

ただし、大量の行を繰り返し追加する処理では、DataFrameへ1行ずつ追加するより、リストなどにデータを蓄積して最後にDataFrame化する方法pd.concat()などを検討したほうがよいでしょう。


行と列を同時に追加する

例えば、既存のDataFrameに新しい行を追加し、その行に新しい列の値も設定できます。

df["職業"] = ["会社員", "エンジニア"]

new_row = pd.DataFrame({
    "名前": ["鈴木"],
    "年齢": [40],
    "職業": ["教師"]
})

df = pd.concat([df, new_row], ignore_index=True)

結果:

   名前  年齢       職業
0  田中  20      会社員
1  佐藤  30  エンジニア
2  鈴木  40       教師

DataFrameに列を追加する方法まとめ

列を追加する方法は、目的によって使い分けると便利です。

方法 用途
df["列名"] = 値 基本的な列追加
df["列名"] = 計算式 計算結果の列を追加
df.insert() 特定位置に列を追加
df.assign() 複数列を追加
np.where() 条件に応じた列を追加

特に基本となるのは、

df["新しい列"] = データ

です。


DataFrameに行を追加する方法まとめ

行の追加では、現在のpandasではpd.concat()を覚えておくと便利です。

方法 用途
df.loc[len(df)] = ... 1行を簡単に追加
pd.concat() DataFrameや複数行を追加
pd.concat(axis=1) 列方向にDataFrameを結合

特にDataFrame同士を結合する場合は、

df = pd.concat([df1, df2], ignore_index=True)

が基本です。


Pandas DataFrameの行・列追加でよくある質問

Q. DataFrameに列を追加する一番簡単な方法は?

次の方法です。

df["新しい列"] = データ

例えば、

df["合計"] = df["数学"] + df["英語"]

のように、既存列から新しい列を作ることもできます。


Q. DataFrameに行を追加するには?

現在のpandasでは、pd.concat()を利用するのが基本です。

df = pd.concat([df, new_row], ignore_index=True)

Q. DataFrame.append()は使えない?

はい。DataFrame.append()はpandas 2.0で削除されています。

現在は基本的にpd.concat()を使用します。


Q. DataFrameの先頭に行を追加するには?

追加したいDataFrameを先に指定します。

df = pd.concat([new_row, df], ignore_index=True)

これでnew_rowがDataFrameの先頭になります。


Q. DataFrameの途中に行を追加できますか?

可能です。

例えば、インデックスを利用して並べ替える方法があります。

ただし、頻繁に途中へ行を挿入する処理はDataFrameの得意な操作ではありません。

大量のデータを扱う場合は、最初にデータをリストなどへまとめてからDataFrameを作成するほうが効率的なケースがあります。


まとめ:Pandas DataFrameの行・列追加を使い分けよう

PandasのDataFrameに行や列を追加する方法は、難しいものではありません。

列を追加するときは、

df["新しい列"] = データ

行を追加するときは、

df = pd.concat([df, new_row], ignore_index=True)

を基本として覚えておきましょう。

また、特定の位置に列を追加する場合は、

df.insert()

条件に応じて列を作る場合は、

np.where()

などが便利です。

特に注意したいのが、古いpandasコードで使われているappend()です。現在のpandasではDataFrame.append()は削除されているため、DataFrame同士を結合して行を追加する場合はpd.concat()を使うのがポイントです。

Pandasでデータ分析を行うなら、行・列の追加に加えて、抽出・削除・並べ替え・結合・欠損値処理までセットで覚えると、DataFrameをかなり自由に操作できるようになります。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら