Pandas DataFrameに行・列を追加!assign, loc, concatを徹底解説 ➕
PandasのDataFrameを操作する上で、新しい情報を追加することは日常的な作業です。分析の途中で計算結果を新しい列として加えたり、別のデータセットから得られた行を追加したりする場面は頻繁に発生します。しかし、どのような方法でデータ追加を行うのが最適なのか、迷うこともあるでしょう。
この記事では、DataFrameに列を追加する様々な方法(特にassignと直接代入)、そして行を追加する主要な方法(locとconcat)について、それぞれの特徴と使い分けを具体的なコード例を交えながら詳しく解説します。
DataFrameに「新しい列」を追加する方法 addColumn 📊
DataFrameに列を追加する方法はいくつかありますが、代表的なものを紹介します。
1. 直接代入:最もシンプルで頻繁に使う方法
新しい列に代入演算子(=)を使って値を割り当てるのが、最もシンプルで直感的な方法です。指定した列名がなければ新しい列として追加され、既存の列名であればその列が更新されます。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120]
})
print("--- 元のDataFrame ---")
print(df)
# 新しい列 '在庫数' を追加(リストで値を指定)
df['在庫数'] = [50, 120, 30]
# 新しい列 '税込価格' を追加(既存列から計算)
df['税込価格'] = df['価格'] * 1.1
print("\n--- 列を追加後のDataFrame ---")
print(df)
2. assign():チェーンメソッドで複数列をスマートに追加 ✨
assign()メソッドは、新しい列を追加する際に、元のDataFrameを変更せず(非破壊的)、新しいDataFrameを返すため、メソッドチェーンで複数の操作をつなげたい場合に非常に便利です。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120]
})
# assign() で新しい列を追加
# price_tax = df['価格'] * 1.1 # 内部で計算式も使える
df_assigned = df.assign(
在庫数=[50, 120, 30],
税込価格=lambda x: x['価格'] * 1.1 # lambdaを使って既存列を参照可能
)
print("\n--- assign() で列を追加後のDataFrame ---")
print(df_assigned)
# 元のDataFrameは変更されていないことを確認
print("\n--- 元のDataFrame (変更なし) ---")
print(df)
assign()は、特に複数の新しい列を一度に追加したり、複雑な処理をチェーンさせたりする際に、コードの可読性を高めます。
DataFrameに「新しい行」を追加する方法 addRow ➕
DataFrameに行を追加する方法もいくつかありますが、Pandasのバージョンや追加したいデータの形式によって最適な方法が異なります。
1. loc:特定のインデックスに行を挿入(推奨)
locインデクサは、新しい行インデックスを指定して直接データを代入することで、行を追加するのに使えます。この方法は特に単一の行を追加する場合に便利です。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん'],
'価格': [100, 80]
}, index=['A', 'B']) # カスタムインデックス
print("--- 元のDataFrame ---")
print(df)
# 新しい行 'C' を追加
df.loc['C'] = ['バナナ', 120]
# 新しい行 'D' を追加(辞書形式でも指定可能)
df.loc['D'] = {'商品名': 'ぶどう', '価格': 250}
print("\n--- locで行を追加後のDataFrame ---")
print(df)
2. pd.concat():複数のDataFrameを結合(複数行・DataFrameの追加に最適)
pd.concat()関数は、複数のDataFrameやSeriesを結合するために設計されており、既存のDataFrameに新しい行(または複数の行)を追加する際に最も汎用的で推奨される方法です。特に、追加したいデータがすでにDataFrame形式になっている場合に強力です。
import pandas as pd
df_existing = pd.DataFrame({
'商品名': ['りんご', 'みかん'],
'価格': [100, 80]
})
# 追加したい新しいデータを行として持つDataFrame
df_new_rows = pd.DataFrame({
'商品名': ['バナナ', 'ぶどう'],
'価格': [120, 250]
})
# axis=0 で行方向に結合(デフォルト)
# ignore_index=True で新しいインデックスを振り直す
df_combined = pd.concat([df_existing, df_new_rows], ignore_index=True)
print("\n--- concat() で行を追加後のDataFrame ---")
print(df_combined)
append()メソッドについて(非推奨)
Pandasの古いバージョンではDataFrame.append()メソッドが行追加に使えましたが、Pandas 2.0以降では非推奨となり、将来的に削除される予定です。代わりにpd.concat()を使うことが強く推奨されています。
まとめ:行・列追加の使い分け 💡
| 追加対象 | メソッド/関数 | 特徴 | 使い分けのヒント |
| 列 | 直接代入 (df['new_col'] = ...) |
最もシンプルで直感的。元のDataFrameを変更する(破壊的)。 | 単一の列を追加・更新する際に素早く行いたい場合。 |
| 列 | assign() |
非破壊的で新しいDataFrameを返す。メソッドチェーン向き。 | 複数の列をまとめて追加したい、コードをチェーンさせたい場合。 |
| 行 | loc |
特定のインデックスに直接値を代入。 | 単一の行をインデックスを指定して追加したい場合。 |
| 行 | pd.concat() |
複数のDataFrameを結合。 | 複数の行やDataFrame全体を既存のDataFrameに追加したい場合。 |
これらの方法を使いこなすことで、PandasのDataFrameに対して柔軟かつ効率的にデータを追加できるようになり、データ分析の幅が大きく広がるでしょう。状況に応じて最適な追加方法を選択し、コードをよりスマートに記述してください!

