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

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.