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をかなり自由に操作できるようになります。





