pandas.DataFrameの列の順序を入れ替える
概要
pandasでデータフレームの列の順序を入れ替えたい
日本語でググると出てくるのは
pandas.DataFrame.ix
を使ったものだが、ix
はpandas 0.20.0 以降では非推奨*1素直に
[]
やloc
、iloc
なりを使って指定しましょう。
本論
やりたいこと
pandasで列の順序を入れ替えたい。逆順にしたり、追加した列の場所を移動したりしたい。
日本語でググると...
日本語でググると以下のようなpandas.DataFrame.ix
を使ったページがヒットする。
行はスライスで全指定して、列をカラム名で指定してる。
しかし、そもそもix
はpandas 0.20.0 以降では非推奨になっているので、基本的にこれから各コードで記載すべきではない。
まともなやり方
列を操作したいだけなら[]
で列名を指定すればよい。
# pandasのドキュメントを参考にデータフレームの初期化 dates = pd.date_range('1/1/2000', periods=8) df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D']) # A B C D #2000-01-01 0.333113 -0.385784 0.848445 -0.172187 #2000-01-02 0.091376 0.699982 -2.448879 0.012055 #2000-01-03 0.273267 -0.203492 0.477200 -0.170348 #2000-01-04 0.747750 0.253019 -0.025682 -0.343925 #2000-01-05 -0.155484 0.644080 0.437013 0.623010 #2000-01-06 -0.070695 -0.868981 0.289951 2.202987 #2000-01-07 -1.301506 0.301445 0.956880 1.197488 #2000-01-08 2.112945 -1.066225 -0.075310 0.586197 # 逆順にしたい場合は列名をスライスで逆順に取得すればいい df[df.columns[::-1]] # D C B A #2000-01-01 -0.172187 0.848445 -0.385784 0.333113 #2000-01-02 0.012055 -2.448879 0.699982 0.091376 #2000-01-03 -0.170348 0.477200 -0.203492 -0.273267 #2000-01-04 -0.343925 -0.025682 0.253019 0.747750 #2000-01-05 0.623010 0.437013 0.644080 -0.155484 #2000-01-06 2.202987 0.289951 -0.868981 -0.070695 #2000-01-07 1.197488 0.956880 0.301445 -1.301506 #2000-01-08 0.586197 -0.075310 -1.066225 2.112945 # 列名をリストで指定すれば自由な順番で取得できる df[['D','C','B','A']] # データフレームの内容は上記と同じなので省略
行も指定したいときはloc
やiloc
をつかう。
特定の列を列名なり列番号で指定すればよいだけ。
※以下の例では、行をスライスで全指定している。
df.loc[:,['D','C','B','A']] df.loc[:,df.columns[::-1]] df.iloc[:,[3,2,1,0]] # 上記はすべて、[]で逆順にする場合と同じ結果になる。
なお、ご多分に漏れず、上記は新しいDataFrameを返すだけ。 そのため元のDataFrameを変更したいときは元のDataFrameを指定して代入すること。
参考
スライスについて
ixの非推奨(deprecated)について
pandasのデータフレーム操作について
- Indexing and Selecting Data — pandas 0.23.4 documentation
- pandasで任意の位置の値を取得・変更するat, iat, loc, iloc | note.nkmk.me
全然関係ないけど
Indexing and Selecting Data — pandas 0.23.4 documentation
によると列の値を入れ替えたい場合は、生の値を操作しないといけないそうな。しかし、こういう場合はpandas.DataFrame.rename()
で列名を変更してしまえばよいのではないだろうか。
*1:本記事時点の最新リリースは0.23.4