DataFrameで行・列(インデックス・カラム)をまとめて作成する方法

本記事ではDataFrameの操作として,以下の内容を解説しています.

  • 既存のDataFrameに空の行・列をまとめて追加する
  • 行・列の順番を入れ替える

公式 Reference: pandas.DataFrame.reindex

事前準備

まずはサンプルのDataFrameを作成します.


import pandas as pd

df = pd.DataFrame(range(3), columns=['col_1'])
df
col_1
0 0
1 1
2 2

空の行(インデックス)を追加

pandas.DataFrameのメソッドreindexを使用して以下のように作成できます.


new_index = [0, 1, 2, 3]
df1 = df.reindex(index=new_index)
df1
col_1
0 0.0
1 1.0
2 2.0
3 NaN

reindexのパラメータindexを利用しています.
「既存のDataFrameのインデックス」+「追加したいインデックス」をリストで指定することで既存のデータはそのまま,追加したインデックスにはnp.nanが入ります.

参考

col_1列のデータ型がint64からfloat64に変わっていることに注意してください.1
これは新しく追加したインデックスの要素がnp.nanのため生じています.
(追加インデックスの要素を指定する方法は後述

注意

reindexではパラメータindexに指定したカラムのみが戻ってきます.
そのため既存のDataFrameにあるインデックスを指定しなかった場合は以下のようになります.


df.reindex(index=[0, 3])
col_1
0 0.0
3 NaN

既存のインデックス名を間違えるとインデックスが丸ごと消えるので注意しましょう.

行(インデックス)を並び替える

インデックスを並び替えるには以下のようにします.


new_index2 = [3, 2, 1, 0]
df1_r = df.reindex(index=new_index2)
df1_r
col_1
3 NaN
2 2.0
1 1.0
0 0.0

パラメータindexで指定するリストを任意の並びに変更すればその順序でインデックスが並び替えられます.

空の列(カラム)を追加

カラムを新しく追加する際もインデックス追加の場合と同様にpandas.DataFrameのメソッドreindexを使用して以下のように作成できます.


col = ['col_1', 'col_2', 'col_3']
df2 = df.reindex(columns=col)
df2
col_1 col_2 col_3
0 0 NaN NaN
1 1 NaN NaN
2 2 NaN NaN

reindexのパラメータcolumnsを利用しています.
「既存のDataFrameのカラム」+「追加したいカラム」をリストで指定することで既存のデータはそのまま,追加したカラムにはnp.nanが入ります.

注意

パラメータcolumnsに関しても指定したカラムのみが戻ってきます.
そのため既存のDataFrameにあるカラムを指定しなかった場合は以下のようになります.


df.reindex(columns=['col_2', 'col_3'])
col_2 col_3
0 NaN NaN
1 NaN NaN
2 NaN NaN

カラム名の指定を間違えるとカラムが丸ごと消えるので注意しましょう.

列(カラム)を並び替える

カラムの並び替えもインデックスの場合と同様に以下のようにします.


col2 = ['col_3', 'col_1', 'col_2']
df2_r = df.reindex(columns=col2)
df2_r
col_3 col_1 col_2
0 NaN 0 NaN
1 NaN 1 NaN
2 NaN 2 NaN

パラメータcolumnsで指定するリストを任意の並びに変更すればその順序でカラムが並び替えられます.

新しく追加する行・列のデフォルト要素を変更したい

新しくインデックス・カラムを追加する場合,その要素はnp.nanがデフォルトです.
これを変更するにはパラメータfill_valueを指定します.2
以下の例では文字列「欠損値」を入れています.


df3 = df.reindex(columns=col, fill_value='欠損値')
df3
col_1 col_2 col_3
0 0 欠損値 欠損値
1 1 欠損値 欠損値
2 2 欠損値 欠損値

ひとこと

必要に駆られてDataFrameにまとめて行・列を追加する際に役立つかと思います.
1列だけ追加などであればdf['列名'] = 100の方がいいですね.
なお,DataFrameでの操作は基本的に遅いので,先にNumPyで行列を作成して一気にDataFrameへ変換することが普通です.


  1. print(f'{df.dtypes[0]} -> {df1.dtypes[0]}') >>> int64 -> float64 

  2. インデックス・カラムともに同じです.