Cara menjumlahkan nilai yang dikelompokkan berdasarkan dua kolom dalam panda

21

Saya memiliki Pandaf DataFrame seperti ini:

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

Bagaimana saya bisa menghasilkan DataFrame baru seperti ini:

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

Jawaban:

16

pivot_table dibuat untuk ini:

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

hasil dalam

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

Secara pribadi saya menemukan pendekatan ini jauh lebih mudah untuk dipahami, dan tentu saja lebih pythonic daripada operasi kelompok yang berbelit-belit. Lalu jika Anda ingin format yang ditentukan, Anda bisa merapikannya:

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

yang memberi Anda

       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
Josh D.
sumber
1
Bagus! Ini harus menjadi jawaban yang diterima.
tuomastik
@Josh D. Ini keren dan mudah! Saya setuju bahwa dibutuhkan kekuatan otak untuk mengetahui cara kerja groupby. Terima kasih!
Kevin
8

Sihir hitam panda:

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']

Menghasilkan 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
tuomastik
sumber
Suci! Sihir hitam sangat kuat! Terima kasih banyak!
Kevin
Sama-sama! Lihat jawaban yang diperbarui; Saya menyederhanakan ekspresi dan menambahkan perbaikan untuk nama kolom persis seperti yang diminta.
tuomastik
Saya pikir versi Anda sebelumnya memiliki kelebihan karena dapat diterapkan ke set data yang lebih rumit lainnya. Saya menyalinnya di sini: df.groupby (['Date', 'Groups', 'data']) ['data']. Sum (). Sum (level = ['Date', 'Groups']). Unstack ( 'Grup'). Fillna (0)
Kevin
@Kevin Jika jawaban ini atau yang akan datang menyelesaikan masalah Anda, harap terima jawabannya.
tuomastik