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