de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
Davide Tamburrino
Davide Tamburrino
Question

Python pandas groupby agregat pada beberapa kolom, lalu pivot

Dalam Python, saya memiliki DataFrame pandas yang mirip dengan berikut ini:

Item | shop1 | shop2 | shop3 | Category
------------------------------------
Shoes| 45    | 50    | 53    | Clothes
TV   | 200   | 300   | 250   | Technology
Book | 20    | 17    | 21    | Books
phone| 300   | 350   | 400   | Technology

Di mana shop1, shop2 dan shop3 adalah biaya setiap item di toko yang berbeda. Sekarang, saya perlu mengembalikan DataFrame, setelah beberapa pembersihan data, seperti ini:

Category (index)| size| sum| mean | std
----------------------------------------

di mana ukuran adalah jumlah item di setiap Kategori dan jumlah, rata-rata dan std terkait dengan fungsi yang sama yang diterapkan pada 3 toko. Bagaimana saya bisa melakukan operasi ini dengan pola split-apply-combine (groupby, aggregate, apply,...) ?

Dapatkah seseorang membantu saya? Saya akan gila dengan yang satu ini...terima kasih!

23 2017-04-02T20:03:44+00:00 3
 smci
smci
Pertanyaan edit 16 Februari 2018 в 7:28
Pemrograman
python
pandas
dataframe
pivot
data-cleaning
Solution / Answer
 piRSquared
piRSquared
2 April 2017 в 11:27
2017-04-02T23:27:18+00:00
Lebih
Sumber
Sunting
#33171248

Diedit untuk Pandas 0.22+ dengan mempertimbangkan tidak digunakannya lagi penggunaan kamus dalam grup dengan agregasi.

Kami menyiapkan kamus yang sangat mirip di mana kami menggunakan kunci kamus untuk menentukan fungsi kami dan kamus itu sendiri untuk mengganti nama kolom.

rnm_cols = dict(size='Size', sum='Sum', mean='Mean', std='Std')
df.set_index(['Category', 'Item']).stack().groupby('Category') \
  .agg(rnm_cols.keys()).rename(columns=rnm_cols)

            Size   Sum        Mean        Std
Category                                     
Books          3    58   19.333333   2.081666
Clothes        3   148   49.333333   4.041452
Technology     6  1800  300.000000  70.710678

opsi 1 gunakan agg ← tautan ke dokumen

agg_funcs = dict(Size='size', Sum='sum', Mean='mean', Std='std')
df.set_index(['Category', 'Item']).stack().groupby(level=0).agg(agg_funcs)

                  Std   Sum        Mean  Size
Category                                     
Books        2.081666    58   19.333333     3
Clothes      4.041452   148   49.333333     3
Technology  70.710678  1800  300.000000     6

pilihan 2 lebih banyak untuk lebih sedikit pakai describe ← tautan ke dokumen

df.set_index(['Category', 'Item']).stack().groupby(level=0).describe().unstack()

            count        mean        std    min    25%    50%    75%    max
Category                                                                   
Books         3.0   19.333333   2.081666   17.0   18.5   20.0   20.5   21.0
Clothes       3.0   49.333333   4.041452   45.0   47.5   50.0   51.5   53.0
Technology    6.0  300.000000  70.710678  200.0  262.5  300.0  337.5  400.0
 nicolom
nicolom
Jawaban edit 28 Mei 2019 в 1:53
18
0
Scott Boston
Scott Boston
2 April 2017 в 8:30
2017-04-02T20:30:13+00:00
Lebih
Sumber
Sunting
#33171246
df.groupby('Category').agg({'Item':'size','shop1':['sum','mean','std'],'shop2':['sum','mean','std'],'shop3':['sum','mean','std']})

Atau jika Anda menginginkannya di semua toko:

df1 = df.set_index(['Item','Category']).stack().reset_index().rename(columns={'level_2':'Shops',0:'costs'})
df1.groupby('Category').agg({'Item':'size','costs':['sum','mean','std']})
Scott Boston
Scott Boston
Jawaban edit 2 April 2017 в 11:22
10
0
 foglerit
foglerit
2 April 2017 в 8:40
2017-04-02T20:40:58+00:00
Lebih
Sumber
Sunting
#33171247

Jika saya mengerti dengan benar, Anda ingin menghitung metrik agregat untuk semua toko, bukan untuk masing-masing toko secara individual. Untuk melakukan itu, pertama-tama Anda dapat stack dataframe Anda dan kemudian mengelompokkan berdasarkan Kategori:

stacked = df.set_index(['Item', 'Category']).stack().reset_index()
stacked.columns = ['Item', 'Category', 'Shop', 'Price']
stacked.groupby('Category').agg({'Price':['count','sum','mean','std']})

Yang menghasilkan

           Price                             
           count   sum        mean        std
Category                                     
Books          3    58   19.333333   2.081666
Clothes        3   148   49.333333   4.041452
Technology     6  1800  300.000000  70.710678
0
0
Related communities 6
Python Indonesia
Python Indonesia
24 631 pengguna
Programmer Python Indonesia. Group ini dikelola oleh sejumlah admin. Baca pesan tersemat / pinned message: https://t.me/pythonID/217588
Buka telegram
Indonesian Python Warriors
Indonesian Python Warriors
1 462 pengguna
Di grup ini tidak ada kewajiban untuk menggunakan username dan foto. Yang tidak boleh adalah spamming. Gak boleh baper, kalau nanya yang bener, eror jangan difoto pake HP, gunakan screenshot, code copas ke pastebin.com lalu share link ke sini.
Buka telegram
Python-ID Jogja
Python-ID Jogja
962 pengguna
Buka telegram
BASIC PYTHON INDONESIA
BASIC PYTHON INDONESIA
220 pengguna
Buka telegram
Python Newbie Indonesia
Python Newbie Indonesia
181 pengguna
Peraturan grup Python Newbie 🌻Dilarang spam 🌻Dilarang menggunakan bahasa kasar 🌻Dilarang beriklan di grup tanpa seizin admin Beberapa video dasar python dapat diliat melalui channel youtube juan aditya Jangan lupa untuk subscribe ya🙏
Buka telegram
PythonWealth Indonesia 🇮🇩
PythonWealth Indonesia 🇮🇩
29 pengguna
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
UbiBot UK
Terdaftar 14 jam yang lalu
2
Галина Утяшова
Terdaftar 1 hari yang lalu
3
Asilbek Qadamboyev
Terdaftar 4 hari yang lalu
4
Akshit Mehta
Terdaftar 1 minggu yang lalu
5
me you
Terdaftar 1 minggu yang lalu
ID
JA
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi