Pandas Multi-Index'i sütuna çevirin


160

2 dizin düzeyine sahip bir veri çerçevem ​​var:

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

Buna dönüştürmek istediğim:

Trial    measurement       value

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

Bunu en iyi nasıl yapabilirim?

Buna ihtiyacım var çünkü verileri burada belirtildiği gibi toplamak istiyorum , ancak sütunlarımı indeks olarak kullanılıyorsa bu şekilde seçemiyorum.


2
Yineleme: stackoverflow.com/questions/18624039/… İlk öneriyi istiyorsunuz. .reset_index()
TomAugspurger

1
çok teşekkürler, aslında bunu çok araştırdım, ama "çoklu dizini sütuna yap" ve benzer sorgular bana her zaman veri çerçevelerini döndürmek isteyen iş parçacıkları getirdi ...
TheChymera

3
Cevabı zaten bildiğiniz halde bulmak her zaman daha kolay :)
TomAugspurger

Yanıtlar:


202

Reset_index () sütun olarak DataFrame içine endeks değerleri aktaran bir panda DataFrame yöntemidir. Parametrenin varsayılan ayarı drop = False şeklindedir (bu, dizin değerlerini sütun olarak tutacaktır).

Tek yapmanız gereken .reset_index(inplace=True)DataFrame adından sonra eklemek :

df.reset_index(inplace=True)  

3
Yerinde sıfırlama 3 dizin düzeyine sahip olduğum durumum için işe yaramadı. Alternatif, yeni sıfırlanan veri çerçevesini yenisine atamaktır: df2 = df.reset_index ()
Gorkem

8
Yalnızca belirli seviyeleri sıfırlamak içindf.reset_index(level=[...])
cs95

22

Bu sizin durumunuz için gerçekten geçerli değil ancak başkalarının (5 dakika önceki benim gibi) bilmesi yardımcı olabilir. Birinin multindex'i şu şekilde aynı ada sahipse:

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

df.reset_index(inplace=True) başarısız olur, çünkü oluşturulan sütunlar aynı adlara sahip olamaz.

Öyleyse, şunu elde df.index = df.index.set_names(['Trial', 'measurement'])etmek için multindex'i yeniden adlandırmanız gerekir :

                           value
Trial    measurement       

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

Ve sonra df.reset_index(inplace=True)bir cazibe gibi çalışacak.

Bu sorunla live_date, adı verilen bir tarih saat sütununda (indeks değil) yıla ve aya göre gruplandırdıktan sonra karşılaştım; bu , hem yıl hem de ayın adlandırıldığı anlamına geliyordu live_date.


1
Deneme değerlerinizin kendilerini tekrar etmesini nasıl sağlayabilirsiniz? Benim de aynı problemi yaşadım ve değerlerimin kendini tekrar etmemesi dışında işe yarıyor.
Rich

6

@ Cs95 bir yorumda belirtildiği gibi, yalnızca bir düzeyi düşürmek için şunu kullanın:

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

Bu, sıfırladıktan sonra istediğiniz dizini yeniden tanımlamanıza gerek kalmaz.


0

Ben de Karl'ın sorunuyla karşılaştım. Kendimi toplanmış sütunu yeniden adlandırırken ve ardından dizini sıfırlarken buldum.

df = pd.DataFrame(df.groupby(['arms', 'success'])['success'].sum()).rename(columns={'success':'sum'})

görüntü açıklamasını buraya girin

df = df.reset_index()

görüntü açıklamasını buraya girin


0

Kullanılamayacağı durumlar df.reset_index()olabilir (örneğin, dizine ihtiyacınız olduğunda da). Bu durumda, index.get_level_values()dizin değerlerine doğrudan erişmek için kullanın:

df['Trial'] = df.index.get_level_values(0)
df['measurement'] = df.index.get_level_values(1)

Bu, dizin değerlerini ayrı sütunlara atayacak ve dizini koruyacaktır.

Daha fazla bilgi için belgelere bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.