web-dev-qa-db-ja.com

Pandasマルチインデックスを列に変換

2つのインデックスレベルを持つデータフレームがあります。

                         value
Trial    measurement
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

私はこれに変えたい:

Trial    measurement       value

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

どうすればこれを行うことができますか?

データを集約したいのでこれが必要です ここで説明したように ですが、インデックスとして使用されている場合、そのような列を選択することはできません。

118
TheChymera

reset_index()は、インデックス値を列としてDataFrameに転送するpandas DataFrameメソッドです。パラメータのデフォルト設定はdrop = False(インデックス値を列として保持します)です。

必要なことは、DataFrameの名前の後に.reset_index(inplace=True)を追加するだけです:

df.reset_index(inplace=True)  
152
CraigSF

これは実際にはあなたのケースには当てはまりませんが、他の人(5分前の私のような)が知るのに役立つかもしれません。 multindexの名前が次のように同じ場合:

                         value
Trial        Trial
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

df.reset_index(inplace=True)は失敗し、作成された列は名前を共有できません。

そのため、次を取得するには、df.index = df.index.set_names(['Trial', 'measurement'])でmultindexの名前を変更する必要があります。

                           value
Trial    measurement       

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

そして、df.reset_index(inplace=True)はチャームのように機能します。

live_dateというdatetime-column(indexではない)で年と月でグループ化すると、この問題が発生しました。つまり、年と月の両方がlive_dateという名前になりました。

16
Karl Anka

コメントで@ cs95が言及したように、1つのレベルのみをドロップするには、次を使用します。

df.reset_index(level=[...])

これにより、リセット後に目的のインデックスを再定義する必要がなくなります。

2
sameagol