pandas.DataFrameの列の順序を入れ替える

概要

  • pandasでデータフレームの列の順序を入れ替えたい

  • 日本語でググると出てくるのはpandas.DataFrame.ixを使ったものだが、ixはpandas 0.20.0 以降では非推奨*1

  • 素直に[]locilocなりを使って指定しましょう。

本論

やりたいこと

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']]

# データフレームの内容は上記と同じなので省略

行も指定したいときはlocilocをつかう。 特定の列を列名なり列番号で指定すればよいだけ。 ※以下の例では、行をスライスで全指定している。

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.DataFrame.rename()で列名を変更してしまえばよいのではないだろうか。

*1:本記事時点の最新リリースは0.23.4