HOWTO · Pandas

Pandas DataFrame で空の列を作成する方法

空の列を Pandas の DataFrame に追加するには、単純な代入演算子、reindex()、assign()、および insert()メソッドを使用します。

このページの内容

Pythonで既存のpandas DataFrameに空の列を追加するには、空文字列を入れる場合は df["NewColumn"] = ""、欠損値を入れる場合は df["NewColumn"] = float("nan") を使います(NaN)。どちらも既存の行やほかの列を保持します。空文字列は文字列値なので、後の計算やフィルタリングで必要になる値の種類に合わせて選んでください。

複数の列を追加するには reindex()、名前を指定して列を追加したDataFrameを返すには assign()、列の位置を指定するには insert() を使えます。例の実行にはpandasとNumPyが必要です。

単純な代入で空の列を作成する

新しい列にスカラー値を代入すると、その値が既存のすべての行に設定されます。代入は df を直接変更し、新しい列を右端に追加します。列名がすでに存在する場合は内容が置き換わるため、既存データを保持するには新しい名前を使ってください。

次の例では、空文字列、NumPyの欠損値マーカー、空のpandas Series を比較します。

このセクションのコードと表示されるラベルや出力は英語のままです。

import pandas as pd
import numpy as np

dates = ["April-20", "April-21", "April-22", "April-23", "April-24", "April-25"]
income = [10, 20, 10, 15, 10, 12]
expenses = [3, 8, 4, 5, 6, 10]


df = pd.DataFrame({"Date": dates, "Income": income, "Expenses": expenses})

df["Empty_1"] = ""
df["Empty_2"] = np.nan
df["Empty_3"] = pd.Series()

print(df)

出力:

       Date  Income  Expenses Empty_1  Empty_2 Empty_3
0  April-20      10         3              NaN     NaN
1  April-21      20         8              NaN     NaN
2  April-22      10         4              NaN     NaN
3  April-23      15         5              NaN     NaN
4  April-24      10         6              NaN     NaN
5  April-25      12        10              NaN     NaN

Empty_1 には空文字列が入り、Empty_2 には NaN が入ります。Series を代入すると、pandasはそのインデックスラベルをDataFrameの行ラベルに合わせます。空の Series には一致するラベルがないため、Empty_3 のすべての値も欠損値になります。

型を明示する方法として、df["NewColumn"] = pd.Series(index=df.index, dtype="float64") を使えます。df.index を指定すると、意図した行との対応が明確になります。後で欠損値を選ぶには、NaN との等値比較ではなく df["NewColumn"].isna() を使ってください。空文字列は別途 "" と比較します。

pandas.DataFrame.reindex() メソッドで空の列を追加する

pandas.DataFrame.reindex() メソッドは、指定した列ラベルと順序のDataFrameを返します。新しく追加されるラベルには、既定で欠損値が設定されます。注意してください。columns に指定するのは追加する列だけではなく、結果に含める列全体です。

このセクションのコードと表示されるラベルや出力は英語のままです。

import pandas as pd
import numpy as np

dates = ["April-20", "April-21", "April-22", "April-23", "April-24", "April-25"]
income = [10, 20, 10, 15, 10, 12]
expenses = [3, 8, 4, 5, 6, 10]


df = pd.DataFrame({"Date": dates, "Income": income, "Expenses": expenses})


column_names = ["Empty_1", "Empty_2", "Empty_3"]

df = df.reindex(columns=column_names)
print(df)

出力:

   Empty_1  Empty_2  Empty_3
0      NaN      NaN      NaN
1      NaN      NaN      NaN
2      NaN      NaN      NaN
3      NaN      NaN      NaN
4      NaN      NaN      NaN
5      NaN      NaN      NaN

この結果では6つの行ラベルは残りますが、Date、Income、Expenses は削除されます。結果を df に再代入すると、元の参照が置き換わります。

元のデータを残すには、まず df.columns.tolist() を取得してから新しい列名を追加します。こうすると既存列の順序が保たれ、新しい列は右端に配置されます。このメソッドは元のオブジェクトを直接変更しないため、返されたDataFrameを保存してください。次の例を実行します。

import pandas as pd
import numpy as np

dates = ["April-20", "April-21", "April-22", "April-23", "April-24", "April-25"]
income = [10, 20, 10, 15, 10, 12]
expenses = [3, 8, 4, 5, 6, 10]


df = pd.DataFrame({"Date": dates, "Income": income, "Expenses": expenses})

df = df.reindex(columns=df.columns.tolist() + ["Empty_1", "Empty_2", "Empty_3"])
print(df)

出力:

       Date  Income  Expenses  Empty_1  Empty_2  Empty_3
0  April-20      10         3      NaN      NaN      NaN
1  April-21      20         8      NaN      NaN      NaN
2  April-22      10         4      NaN      NaN      NaN
3  April-23      15         5      NaN      NaN      NaN
4  April-24      10         6      NaN      NaN      NaN
5  April-25      12        10      NaN      NaN      NaN

元の日付、収入、支出の列はそのまま残り、その後ろに NaN を含む列が3つ追加されます。重複ラベルを要求しないよう、新しい列名には既存の名前を使わないでください。

pandas.DataFrame.assign() でPandas DataFrameに空の列を追加する

pandas.DataFrame.assign() メソッドは、名前を指定した1つ以上の列を含むDataFrameを返します。各キーワードが列名になり、その値が列の内容になります。例のように df = df.assign(...) として返されたオブジェクトを保持するか、別の名前に保存して元のDataFrameを残します。

このセクションのコードと表示されるラベルや出力は英語のままです。

import pandas as pd
import numpy as np

dates = ["April-20", "April-21", "April-22", "April-23", "April-24", "April-25"]
income = [10, 20, 10, 15, 10, 12]
expenses = [3, 8, 4, 5, 6, 10]


df = pd.DataFrame({"Date": dates, "Income": income, "Expenses": expenses})

df = df.assign(Empty_1="", Empty_2=np.nan)
print(df)

出力:

       Date  Income  Expenses Empty_1  Empty_2
0  April-20      10         3              NaN
1  April-21      20         8              NaN
2  April-22      10         4              NaN
3  April-23      15         5              NaN
4  April-24      10         6              NaN
5  April-25      12        10              NaN

Empty_1 には空文字列が入り、NaN が入るのは Empty_2 だけです。既存の列も保持されます。直接代入と同様に、既存の列名を指定すると、返されるDataFrame内でその列の内容が置き換わります。

pandas.DataFrame.insert() でDataFrameに空の列を追加する

列の配置が重要な場合は pandas.DataFrame.insert() を使います。df.insert(loc, column, value) の形式で呼び出します。loc は0から始まる列位置、column は新しいラベル、value は必須の値です。空文字列には ""、欠損値には np.nan を指定します。

位置には 0 から len(df.columns) までの整数を指定できます。上限の位置を指定すると列は末尾に追加されます。既定では、既存のラベルを挿入しようとするとエラーになります。allow_duplicates=True を渡せば重複ラベルを許可できますが、後で列を選ぶ際に曖昧になることがあります。

assign() や reindex() と異なり、insert() は df を直接変更し、None を返します。df = df.insert(...) とは書かないでください。

次の例では列を2つ末尾に追加します。

このセクションのコードと表示されるラベルや出力は英語のままです。

import pandas as pd
import numpy as np

dates = ["April-20", "April-21", "April-22", "April-23", "April-24", "April-25"]
income = [10, 20, 10, 15, 10, 12]
expenses = [3, 8, 4, 5, 6, 10]


df = pd.DataFrame({"Date": dates, "Income": income, "Expenses": expenses})
df.insert(3, "Empty_1", "")
df.insert(4, "Empty_2", np.nan)
print(df)

出力:

       Date  Income  Expenses Empty_1  Empty_2
0  April-20      10         3              NaN
1  April-21      20         8              NaN
2  April-22      10         4              NaN
3  April-23      15         5              NaN
4  April-24      10         6              NaN
5  April-25      12        10              NaN

Empty_1 は列位置 3 に入り、空文字列を含みます。その列を挿入した後は、NaN を含む Empty_2 を位置 4 に追加できます。列を先頭に置くには loc=0 を指定します。既存の列は値を変えずに右へ移動します。