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についてはこちらも参照:
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()
を使う。
こちらも参照。
下記に例を示す。
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