本記事では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へ変換することが普通です.