web-dev-qa-db-ja.com

pandas reindex()がインプレースで動作しないのはなぜですか?

reindex docs から:

オプションの塗りつぶしロジックを使用してDataFrameを新しいインデックスに適合させ、前のインデックスに値がない場所にNA/NaNを配置します。新しいインデックスが現在のものと同等で、copy = Falseでない限り、新しいオブジェクトが作成されます。

そのため、copy=Falseを(!)に設定することで、Dataframeを並べ替えられると思いました。ただし、コピーを取得し、それを元のオブジェクトに再度割り当てる必要があるようです。回避できれば、割り当て直したくありません( 理由はこの他の質問からです )。

これは私がやっていることです:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.Rand(5, 5))

df.columns = [ 'a', 'b', 'c', 'd', 'e' ]

df.head()

アウト:

          a         b         c         d         e
0  0.234296  0.011235  0.664617  0.983243  0.177639
1  0.378308  0.659315  0.949093  0.872945  0.383024
2  0.976728  0.419274  0.993282  0.668539  0.970228
3  0.322936  0.555642  0.862659  0.134570  0.675897
4  0.167638  0.578831  0.141339  0.232592  0.976057

インデックスを再作成すると正しい出力が得られますが、元のオブジェクトに再度割り当てる必要があります。これは、copy=Falseを使用して回避したいものです。

df.reindex( columns=['e', 'd', 'c', 'b', 'a'], copy=False )

その行の後の望ましい出力は:

          e         d         c         b         a
0  0.177639  0.983243  0.664617  0.011235  0.234296
1  0.383024  0.872945  0.949093  0.659315  0.378308
2  0.970228  0.668539  0.993282  0.419274  0.976728
3  0.675897  0.134570  0.862659  0.555642  0.322936
4  0.976057  0.232592  0.141339  0.578831  0.167638

copy=Falseが機能しないのはなぜですか?

それはまったく可能ですか?


python 3.5.3、pandas 0.23.3

7
Luis

少しずれたトピックですが、これにより列が配置し直されると思います

    for i, colname in enumerate(list_of_columns_in_desired_order):
        col = dataset.pop(colname)
        dataset.insert(i, colname, col)
0
Matek