pandasのDataFrameに空の列を追加する

pandasのDataFrameに、空の列を新しく追加(挿入)したい場合。

空の列の位置は気にしない場合(右端になる)

既存のDataFrameに1つの列を新規に追加するには、df['new_column'] = (追加したい値)とすればよい。
このとき、好きな値を選べば、空の列ができる。
なお、「空の列」を作るときにこの値を選べ、という唯一の正解は存在しない(と思う)。
以下、実際の例で説明する。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.isnull.html

import pandas as pd
import numpy as np
pd.options.display.notebook_repr_html = False  # jupyter notebook上での出力形式を制御するために書いています。無くても動きます。
# 動作環境の確認
print(pd.__version__)
print(np.__version__)
# --------------------
1.0.1
1.18.1
df = pd.DataFrame({'col_A': [1,2,3], 'col_B': ['p','q','r']})
df
# --------------------
   col_A col_B
0      1     p
1      2     q
2      3     r

適当なDataFrameを作成した。これに対して、空の文字列を指定して、新たな行を追加する。

df['new_col_1'] = ''
df
# --------------------
   col_A col_B new_col_1
0      1     p          
1      2     q          
2      3     r          

次はPythonのNoneを指定してみる。

df['new_col_2'] = None
df
# --------------------
   col_A col_B new_col_1 new_col_2
0      1     p                None
1      2     q                None
2      3     r                None

NumPyのNaNを指定してみる。

df['new_col_3'] = np.nan
df
# --------------------
   col_A col_B new_col_1 new_col_2  new_col_3
0      1     p                None        NaN
1      2     q                None        NaN
2      3     r                None        NaN

pandasのNAを指定してみる。
pd.NAはpandas 1.0.0から追加された新しいNaNです。詳しくはこちらをどうぞ。
pandas 1.0.0 (rc0) での pd.NA の特徴 - Qiita
pandas最新バージョンの、pandas1.0について紹介します - Python学習チャンネル by PyQ

df['new_col_4'] = pd.NA
df
# --------------------
   col_A col_B new_col_1 new_col_2  new_col_3 new_col_4
0      1     p                None        NaN      <NA>
1      2     q                None        NaN      <NA>
2      3     r                None        NaN      <NA>

以上のようにして、空の列を新規追加することができる。

どの値を入れれば良いの?

色々な値を指定して空の列を作れる。「え、そうはいっても、どれを使えば良いの?」という人がいるかも知れない。 「空の列」という定義が一意に決まっているわけではないから、好みに応じて作れば良いと思う。
ここからは事実じゃなくて個人の意見になるのですが。
空の列を作ること自体が目的というわけではなく、空の列を作ってからそこに値を埋めていきたいのだろう。 その値のデータ型(dtype)に応じた値を作れば良いと思う。
(目的に合わないdtypeで列を作ってしまうと、意図しない動作につながる可能性があるため。)

dtypeについてはこちらも参照:

linus-mk.hatenablog.com

df.dtypes
# --------------------
col_A          int64
col_B         object
new_col_1     object
new_col_2     object
new_col_3    float64
new_col_4     object
dtype: object

へぇ、pd.NAを単独で指定すると、そのcolumnのdtypeはobjectになるんだな。

作ろうとしている列のデータ型がobject型なら空文字''None浮動小数点ならnp.NaNが良さそう。整数型の場合は……欠損を表す特別な整数値を指定して作るのが良いんじゃないか?

df.isnull()
# --------------------
   col_A  col_B  new_col_1  new_col_2  new_col_3  new_col_4
0  False  False      False       True       True       True
1  False  False      False       True       True       True
2  False  False      False       True       True       True

ちなみに、isnull()関数を適用すると、空文字列はFalseに、Noneとnp.NaNとpd.NAはTrueになる。

空の列を指定した位置に挿入したい場合

右端ではなく、指定した位置に新たな列を挿入したい場合はinsert()を使う。 こちらも参照。

linus-mk.hatenablog.com

下記に例を示す。

df = pd.DataFrame({'col_A': [1,2,3], 'col_B': ['p','q','r'], 'col_C': [1.2,3.4,5.6]})
df
# --------------------
   col_A col_B  col_C
0      1     p    1.2
1      2     q    3.4
2      3     r    5.6
# col_Bとcol_Cの間に新しく列を追加する。最初の引数に位置を示す2を指定する
df.insert(2, 'new_col', np.NaN)
df
# --------------------
   col_A col_B  new_col  col_C
0      1     p      NaN    1.2
1      2     q      NaN    3.4
2      3     r      NaN    5.6

注意事項

と、ここまで書いてきたが、注意事項がある。空の列を新規追加するそもそもの理由についての問題だ。

すでに書いたが、空の列を作ってそれで満足という人はおそらくいないだろう。 空の列自体が目的というわけではなく、空の列を作ってからそこに何らかの値を埋めていきたいのだろう。

どうやって埋めていくのか。1つずつ値を計算する? もしそうなら、それはpandasが苦手な動作だ。 ループを用いると、処理がとても遅くなる。 特にDataFrameが大きい場合には、他の方法を考えたほうが良いかもしれない。

それでは。

参考

python - How to add an empty column to a dataframe? - Stack Overflow