パンダのマルチインデックスを列に変える


155

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 

これを行うにはどうすればよいですか?

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


2
重複:stackoverflow.com/questions/18624039/… 最初の提案が必要です。.reset_index()
TomAugspurger 2013年

1
多くのおかげで、私は実際にこれを何度も参照しましたが、「マルチインデックスを列に作成」し、同様のクエリを実行すると、データフレームをピボットしたいスレッドが常に得られました...
TheChymera

3
あなたがすでにそれを知っているときはいつでも答えを見つけるのがいつもより簡単です:)
TomAugspurger '21 / 11/13

回答:


192

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

.reset_index(inplace=True)DataFrameの名前の後に追加する必要があるすべて:

df.reset_index(inplace=True)  

3
3つのインデックスレベルをインプレースで設定した私の場合、リセットは機能しませんでした。代わりに、新しくリセットされたデータフレームを新しいデータフレームに割り当てる方法があります:df2 = df.reset_index()
Gorkem

8
特定のレベルのみをリセットするには、df.reset_index(level=[...])
cs95

20

これは実際のケースには当てはまりませんが、他の人(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)、魅力のように動作します。

と呼ばれるdatetime-column(インデックスではない)で年と月でグループ化した後、この問題live_dateが発生しましたlive_date


1
自分の試用値を繰り返すにはどうすればよいですか?私は同じ問題を抱えていましたが、私の値が繰り返されないことを除いて、それは機能します。
リッチ

4

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.