Pandalarda iki sütuna göre gruplandırılmış değerler nasıl toplanır


21

Böyle bir Pandas DataFrame var:

df = pd.DataFrame({
    'Date': ['2017-1-1', '2017-1-1', '2017-1-2', '2017-1-2', '2017-1-3'],
    'Groups': ['one', 'one', 'one', 'two', 'two'],
    'data': range(1, 6)})

    Date      Groups     data  
0  2017-1-1    one       1
1  2017-1-1    one       2
2  2017-1-2    one       3
3  2017-1-2    two       4
4  2017-1-3    two       5

Bunun gibi yeni bir DataFrame'i nasıl oluşturabilirim:

    Date       one     two 
0  2017-1-1    3        0
1  2017-1-2    3        4
2  2017-1-3    0        5

Yanıtlar:


16

pivot_table bunun için yapıldı:

df.pivot_table(index='Date',columns='Groups',aggfunc=sum)

sonuçlanır

         data
Groups    one  two
Date
2017-1-1  3.0  NaN
2017-1-2  3.0  4.0
2017-1-3  NaN  5.0

Şahsen ben bu yaklaşımı anlaşılması daha kolay ve kesinlikle karmaşık bir grup operasyonundan daha pitonik buluyorum. Daha sonra belirtilen formatı istiyorsanız, sadece çeki düzenleyebilirsiniz:

df.fillna(0,inplace=True)
df.columns = df.columns.droplevel()
df.columns.name = None
df.reset_index(inplace=True)

bu sana verir

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

1
Güzel! Bu kabul edilen cevap olmalı.
tuomastik

@Josh D. Bu serin ve anlaşılır! Groupby'nin nasıl çalıştığını bulmanın biraz beyin gücü gerektirdiğine katılıyorum. Teşekkür ederim!
Kevin,

8

Pandalar kara büyü:

df = df.groupby(['Date', 'Groups']).sum().sum(
    level=['Date', 'Groups']).unstack('Groups').fillna(0).reset_index()

# Fix the column names
df.columns = ['Date', 'one', 'two']

Sonuç df:

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

Kutsal! Kara büyü çok güçlü! Çok teşekkürler!
Kevin,

Rica ederim! Güncellenmiş cevaba bakınız; İfadeyi basitleştirdim ve sütun adlarının tam olarak istendiği gibi olması için bir düzeltme ekledim.
tuomastik

Önceki sürümünüzün daha karmaşık veri setlerine uygulanabileceği için avantajı olduğunu düşünüyorum. Ben buraya kopyaladım: df.groupby (['Tarih', 'Gruplar', 'veri']) ['veri']. Sum (). Sum (seviye = ['Tarih', 'Gruplar']). 'Gruplar'). Dolguna (0)
Kevin

@Kevin Bu veya gelecekteki herhangi bir cevap sorununuzu çözdüyse, lütfen cevabı kabul edin.
tuomastik
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.