Apa pengelompokan data dalam python?

Saya baru-baru ini mulai menggunakan pustaka Pandas yang luar biasa dari Python sebagai alat analisis data, dan, sambil menemukan transisi dari data luar biasa R. perpustakaan meja kadang-kadang membuat frustrasi, saya menemukan jalan keluar dan menemukan sebagian besar hal berfungsi dengan baik

Salah satu aspek yang baru-baru ini saya jelajahi adalah tugas mengelompokkan bingkai data besar berdasarkan variabel yang berbeda, dan menerapkan fungsi ringkasan pada setiap grup. Ini dilakukan di Panda menggunakan fungsi "" dan "" dari objek DataFrame Panda

Memperbarui. Panda versi 0. 20. 1 pada Mei 2017 mengubah API agregasi dan pengelompokan. Posting ini telah diperbarui untuk mencerminkan perubahan baru

Contoh DataFrame

Untuk mendemonstrasikan keefektifan dan kesederhanaan perintah pengelompokan, kita memerlukan beberapa data. Sebagai contoh kumpulan data, saya telah mengekstrak catatan penggunaan ponsel saya sendiri. Saya menganalisis jenis data ini menggunakan Pandas selama saya bekerja di KillBiller. Jika Anda ingin mengikuti – file csv lengkap tersedia di sini

Kumpulan data berisi 830 entri dari log ponsel saya selama total waktu 5 bulan. File CSV dapat dimuat ke DataFrame panda menggunakan panda. Bingkai Data. from_csv(), dan terlihat seperti ini

dateurationitemmonthnetworknetwork_type015/10/14 06. 5834. 429data2014-11datadata115/10/14 06. 5813. 000panggilan2014-11Vodafonemobile215/10/14 14. 4623. 000panggilan2014-11Meteormobile315/10/14 14. 484. 000panggilan2014-11Tescomobile415/10/14 17. 274. 000panggilan2014-11Tescomobile515/10/14 18. 554. 000panggilan2014-11Tescomobile616/10/14 06. 5834. 429data2014-11datadata716/10/14 15. 01602. 000panggilan2014-11Threemobile816/10/14 15. 121050. 000panggilan2014-11Threemobile916/10/14 15. 3019. 000panggilan2014-11pesansuarapesansuara1016/10/14 16. 211183. 000panggilan2014-11Threemobile1116/10/14 22. 181. 000sms2014-11Meteormobile…………………Contoh data file CSV yang berisi tanggal dan durasi panggilan telepon yang dilakukan di ponsel saya

Kolom utama dalam file tersebut adalah

  1. tanggal. Tanggal dan waktu entri
  2. durasi. Durasi (dalam detik) untuk setiap panggilan, jumlah data (dalam MB) untuk setiap entri data, dan jumlah teks yang dikirim (biasanya 1) untuk setiap entri sms
  3. barang. Deskripsi peristiwa yang terjadi – dapat berupa panggilan, sms, atau data
  4. bulan. Bulan penagihan yang dimiliki setiap entri – dalam bentuk 'YYYY-MM'
  5. jaringan. Jaringan seluler yang dihubungi/dikirim untuk setiap entri
  6. tipe jaringan. Apakah nomor yang dipanggil adalah nomor ponsel, internasional ('dunia'), pesan suara, telepon rumah, atau nomor lain ('khusus')

Nomor telepon telah dihapus untuk privasi. Kolom tanggal dapat diuraikan menggunakan library dateutil yang sangat praktis

import pandas as pd import dateutil # Load data from csv file data = pd.DataFrame.from_csv('phone_data.csv') # Convert date from string to date times data['date'] = data['date'].apply(dateutil.parser.parse, dayfirst=True)

Meringkas DataFrame

Setelah data dimuat ke Python, Panda membuat perhitungan statistik yang berbeda menjadi sangat sederhana. Misalnya, rata-rata, maks, min, standar deviasi, dan lainnya untuk kolom mudah dihitung

# How many rows the dataset data['item'].count() Out[38]: 830 # What was the longest phone call / data entry? data['duration'].max() Out[39]: 10528.0 # How many seconds of phone calls are recorded in total? data['duration'][data['item'] == 'call'].sum() Out[40]: 92321.0 # How many entries are there for each month? data['month'].value_counts() Out[41]: 2014-11 230 2015-01 205 2014-12 157 2015-02 137 2015-03 101 dtype: int64 # Number of non-null unique network entries data['network'].nunique() Out[42]: 9 _

Kebutuhan untuk fungsi kustom minimal kecuali Anda memiliki persyaratan yang sangat spesifik. Kisaran lengkap statistik dasar yang dapat dihitung dengan cepat dan dibangun ke dalam paket dasar Pandas adalah

FunctionDescriptioncountNumber of non-null observationssumSum of valuesmeanMean of valuesmadMean absolute deviationmedianArithmetic median of valuesminMinimummaxMaximummodeModeabsAbsolute ValueprodProduct of valuesstdUnbiased standard deviationvarUnbiased variancesemUnbiased standard error of the meanskewUnbiased skewness (3rd moment)kurtUnbiased kurtosis (4th moment)quantileSample quantile (value at %)cumsumCumulative sumcumprodCumulative productcummaxCumulative maximumcumminCumulative minimum

Itu. deskripsikan() adalah alat peringkasan yang berguna yang akan dengan cepat menampilkan statistik untuk variabel atau grup apa pun yang diterapkan. Output explain() bervariasi tergantung pada apakah Anda menerapkannya ke kolom numerik atau karakter

Meringkas Grup di DataFrame

Ada kekuatan lebih lanjut yang diberikan ke tangan Anda dengan menguasai fungsionalitas “groupby ()” Pandas. Groupby pada dasarnya membagi data menjadi grup yang berbeda tergantung pada variabel pilihan Anda. Misalnya, ekspresi data. groupby('month')  akan membagi DataFrame kami saat ini berdasarkan bulan

Fungsi groupby() mengembalikan objek GroupBy, tetapi pada dasarnya menjelaskan bagaimana baris kumpulan data asli telah dipisah. objek GroupBy. variabel grup adalah kamus yang kuncinya adalah grup unik yang dihitung dan nilai yang sesuai adalah label sumbu milik setiap grup. Misalnya

data.groupby(['month']).groups.keys() Out[59]: ['2014-12', '2014-11', '2015-02', '2015-03', '2015-01'] len(data.groupby(['month']).groups['2014-11']) Out[61]: 230

Fungsi seperti max(), min(), mean(), first(), last() dapat dengan cepat diterapkan ke objek GroupBy untuk mendapatkan ringkasan statistik untuk setiap grup – fungsi yang sangat berguna. Fungsionalitas ini mirip dengan perpustakaan dplyr dan plyr untuk R. Variabel yang berbeda dapat dikecualikan/dimasukkan dari setiap persyaratan ringkasan

# Get the first entry for each month data.groupby('month').first() Out[69]: date duration item network network_type month 2014-11 2014-10-15 06:58:00 34.429 data data data 2014-12 2014-11-13 06:58:00 34.429 data data data 2015-01 2014-12-13 06:58:00 34.429 data data data 2015-02 2015-01-13 06:58:00 34.429 data data data 2015-03 2015-02-12 20:15:00 69.000 call landline landline # Get the sum of the durations per month data.groupby('month')['duration'].sum() Out[70]: month 2014-11 26639.441 2014-12 14641.870 2015-01 18223.299 2015-02 15522.299 2015-03 22750.441 Name: duration, dtype: float64 # Get the number of dates / entries in each month data.groupby('month')['date'].count() Out[74]: month 2014-11 230 2014-12 157 2015-01 205 2015-02 137 2015-03 101 Name: date, dtype: int64 # What is the sum of durations, for calls only, to each network data[data['item'] == 'call'].groupby('network')['duration'].sum() Out[78]: network Meteor 7200 Tesco 13828 Three 36464 Vodafone 14621 landline 18433 voicemail 1775 Name: duration, dtype: float64

Anda juga dapat mengelompokkan lebih dari satu variabel, memungkinkan kueri yang lebih kompleks

# How many calls, sms, and data entries are in each month? data.groupby(['month', 'item'])['date'].count() Out[76]: month item 2014-11 call 107 data 29 sms 94 2014-12 call 79 data 30 sms 48 2015-01 call 88 data 31 sms 86 2015-02 call 67 data 31 sms 39 2015-03 call 47 data 29 sms 25 Name: date, dtype: int64 # How many calls, texts, and data are sent per month, split by network_type? data.groupby(['month', 'network_type'])['date'].count() Out[82]: month network_type 2014-11 data 29 landline 5 mobile 189 special 1 voicemail 6 2014-12 data 30 landline 7 mobile 108 voicemail 8 world 4 2015-01 data 31 landline 11 mobile 160 ...._

Format output Groupby – Seri atau DataFrame?

Keluaran dari operasi grup dan agregasi bervariasi antara Pandas Series dan Pandas Dataframes, yang dapat membingungkan pengguna baru. Sebagai aturan umum, jika Anda menghitung lebih dari satu kolom hasil, hasil Anda akan menjadi Kerangka Data. Untuk satu kolom hasil, fungsi agg, secara default, akan menghasilkan Seri

Anda dapat mengubahnya dengan memilih kolom operasi secara berbeda

# produces Pandas Series data.groupby('month')['duration'].sum() # Produces Pandas DataFrame data.groupby('month')[['duration']].sum()

Keluaran berkelompok akan memiliki indeks atau multi-indeks pada baris yang sesuai dengan variabel pengelompokan yang Anda pilih. Untuk menghindari pengaturan indeks ini, teruskan “as_index=False” ke operasi groupby

data.groupby('month', as_index=False).agg({"duration": "sum"}) _

Menggunakan parameter as_index saat Pengelompokan data dalam panda mencegah pengaturan indeks baris pada hasil

Beberapa Statistik per Grup

Bagian terakhir dari sintaks yang akan kita periksa adalah fungsi "agg" untuk Panda. Fungsionalitas agregasi yang disediakan oleh fungsi agg() memungkinkan banyak statistik dihitung per grup dalam satu perhitungan.  

Menerapkan satu fungsi ke kolom dalam grup

Instruksi untuk agregasi disediakan dalam bentuk kamus atau daftar python. Kunci kamus digunakan untuk menentukan kolom tempat Anda ingin melakukan operasi, dan nilai kamus untuk menentukan fungsi yang akan dijalankan

Misalnya

# Group the data frame by month and item and extract a number of stats from each group data.groupby( ['month', 'item'] ).agg( { 'duration':sum, # Sum duration per group 'network_type': "count", # get the count of networks 'date': 'first'  # get the first date per group } )

Sintaks kamus agregasi fleksibel dan dapat ditentukan sebelum operasi. Anda juga dapat menentukan fungsi sebaris menggunakan fungsi "lambda" untuk mengekstrak statistik yang tidak disediakan oleh opsi bawaan

# Define the aggregation procedure outside of the groupby operation aggregations = { 'duration':'sum', 'date': lambda x: max(x) - 1 } data.groupby('month').agg(aggregations)_

Menerapkan banyak fungsi ke kolom dalam grup

Untuk menerapkan beberapa fungsi ke satu kolom dalam data yang dikelompokkan, luaskan sintaks di atas untuk meneruskan daftar fungsi sebagai nilai dalam kerangka data agregasi Anda. Lihat di bawah

# Group the data frame by month and item and extract a number of stats from each group data.groupby( ['month', 'item'] ).agg( { # Find the min, max, and sum of the duration column 'duration': [min, max, sum], # find the number of network type entries 'network_type': "count", # minimum, first, and number of unique dates 'date': [min, 'first', 'nunique'] } )_

agg(. ) sintaksnya fleksibel dan mudah digunakan. Ingatlah bahwa Anda dapat meneruskan fungsi kustom dan lambda ke daftar penghitungan gabungan, dan masing-masing akan meneruskan nilai dari kolom dalam data yang dikelompokkan

Mengganti nama kolom agregasi yang dikelompokkan

Kami akan memeriksa dua metode untuk mengelompokkan Bingkai Data dan mengganti nama hasil kolom dalam pekerjaan Anda

Mengelompokkan, menghitung, dan mengganti nama hasil dapat dicapai dalam satu perintah menggunakan fungsionalitas "agg" di Python. Sebuah “pd. NamedAgg” digunakan untuk kejelasan, tetapi bentuk tupel normal (column_name, grouping_function) juga dapat digunakan

Direkomendasikan. Agregasi Bernama Tuple

Diperkenalkan di Panda 0. 25. 0, agregasi grup dengan pelabelan ulang didukung menggunakan "agregasi bernama" dengan tupel sederhana. Tupel Python digunakan untuk memberikan nama kolom yang akan dikerjakan, bersama dengan fungsi yang akan diterapkan.  

Misalnya

# How many rows the dataset data['item'].count() Out[38]: 830 # What was the longest phone call / data entry? data['duration'].max() Out[39]: 10528.0 # How many seconds of phone calls are recorded in total? data['duration'][data['item'] == 'call'].sum() Out[40]: 92321.0 # How many entries are there for each month? data['month'].value_counts() Out[41]: 2014-11 230 2015-01 205 2014-12 157 2015-02 137 2015-03 101 dtype: int64 # Number of non-null unique network entries data['network'].nunique() Out[42]: 9 0
Pengelompokan dengan agregasi bernama menggunakan Pandas 0 baru. 25 sintaks. Tuple digunakan untuk menentukan kolom yang akan dikerjakan dan fungsi yang akan diterapkan ke setiap pengelompokan.

Untuk penamaan yang lebih jelas, Pandas juga menyediakan NamedAggregation named-tuple, yang dapat digunakan untuk mencapai hal yang sama seperti tuple normal

# How many rows the dataset data['item'].count() Out[38]: 830 # What was the longest phone call / data entry? data['duration'].max() Out[39]: 10528.0 # How many seconds of phone calls are recorded in total? data['duration'][data['item'] == 'call'].sum() Out[40]: 92321.0 # How many entries are there for each month? data['month'].value_counts() Out[41]: 2014-11 230 2015-01 205 2014-12 157 2015-02 137 2015-03 101 dtype: int64 # Number of non-null unique network entries data['network'].nunique() Out[42]: 9 _1

Perhatikan bahwa dalam versi Pandas setelah rilis, menerapkan fungsi lambda hanya berfungsi untuk agregasi bernama ini ketika fungsi tersebut adalah satu-satunya fungsi yang diterapkan pada satu kolom, jika tidak menyebabkan KeyError

Mengganti nama indeks menggunakan droplevel dan ravel

Ketika banyak statistik dihitung pada kolom, kerangka data yang dihasilkan akan memiliki set multi-indeks pada sumbu kolom. Multi-indeks bisa jadi sulit untuk dikerjakan, dan saya biasanya harus mengganti nama kolom setelah operasi grup

Salah satu opsi adalah menjatuhkan level teratas (menggunakan. droplevel) dari multi-indeks yang baru dibuat pada kolom menggunakan

# How many rows the dataset data['item'].count() Out[38]: 830 # What was the longest phone call / data entry? data['duration'].max() Out[39]: 10528.0 # How many seconds of phone calls are recorded in total? data['duration'][data['item'] == 'call'].sum() Out[40]: 92321.0 # How many entries are there for each month? data['month'].value_counts() Out[41]: 2014-11 230 2015-01 205 2014-12 157 2015-02 137 2015-03 101 dtype: int64 # Number of non-null unique network entries data['network'].nunique() Out[42]: 9 _2

Namun, pendekatan ini kehilangan nama kolom asli, hanya menyisakan nama fungsi sebagai tajuk kolom. A , seperti yang disarankan oleh pembaca kepada saya, menggunakan metode ravel() pada kolom yang dikelompokkan. Ravel() mengubah multi-indeks Pandas menjadi larik yang lebih sederhana, yang dapat kita gabungkan menjadi nama kolom yang masuk akal

# How many rows the dataset data['item'].count() Out[38]: 830 # What was the longest phone call / data entry? data['duration'].max() Out[39]: 10528.0 # How many seconds of phone calls are recorded in total? data['duration'][data['item'] == 'call'].sum() Out[40]: 92321.0 # How many entries are there for each month? data['month'].value_counts() Out[41]: 2014-11 230 2015-01 205 2014-12 157 2015-02 137 2015-03 101 dtype: int64 # Number of non-null unique network entries data['network'].nunique() Out[42]: 9 _3

Penggantian nama cepat kolom yang dikelompokkan dari multi-indeks groupby() dapat dilakukan dengan menggunakan fungsi ravel()

Dictionary groupby format

Ada perubahan substansial pada fungsi agregasi Panda pada Mei 2017. Mengganti nama variabel menggunakan kamus dalam fungsi agg() seperti pada diagram di bawah ini tidak digunakan lagi/dihapus dari Panda – lihat catatan

Agregasi variabel dalam Pandas Dataframe menggunakan fungsi agg(). Perhatikan bahwa di Pandas versi 0. 20. 1 dan seterusnya, penggantian nama hasil perlu dilakukan secara terpisah

Dalam rilis Pandas yang lebih lama (< ), mengganti nama kolom yang baru dihitung dimungkinkan melalui kamus bersarang, atau dengan meneruskan daftar fungsi untuk kolom. Contoh terakhir kami menghitung beberapa nilai dari kolom durasi dan menamai hasilnya dengan tepat. Perhatikan bahwa hasilnya memiliki tajuk kolom multi-indeks

Perhatikan sintaks ini untuk instalasi baru Python Pandas.  

# How many rows the dataset data['item'].count() Out[38]: 830 # What was the longest phone call / data entry? data['duration'].max() Out[39]: 10528.0 # How many seconds of phone calls are recorded in total? data['duration'][data['item'] == 'call'].sum() Out[40]: 92321.0 # How many entries are there for each month? data['month'].value_counts() Out[41]: 2014-11 230 2015-01 205 2014-12 157 2015-02 137 2015-03 101 dtype: int64 # Number of non-null unique network entries data['network'].nunique() Out[42]: 9 _4

Ringkasan Pengelompokan Python Panda

Fungsi pengelompokan di Panda didokumentasikan dengan baik dalam dokumen resmi dan bekerja dengan kecepatan setara (kecuali jika Anda memiliki data yang sangat besar dan pilih-pilih dengan milidetik Anda) dengan data R. pustaka tabel dan dplyr

Jika Anda tertarik dengan contoh lain untuk latihan, saya menggunakan teknik yang sama untuk menganalisis data cuaca untuk postingan ini, dan saya telah memasukkan petunjuk “cara” di sini

Ada banyak sumber online tentang fungsi ini, dan saya merekomendasikan untuk benar-benar menaklukkan sintaks ini jika Anda menggunakan Panda dengan sungguh-sungguh kapan saja.

Bagaimana cara Python menghitung data yang dikelompokkan?

Metode yang paling sederhana untuk pandas groupby count adalah dengan menggunakan metode panda bawaan bernama size() . Ini mengembalikan seri panda yang memiliki jumlah total jumlah baris untuk setiap grup. Cara kerja dasar metode size() sama dengan metode len() sehingga tidak terpengaruh oleh nilai NaN dalam dataset.

Apa yang dimaksud dengan Groupby dan untuk apa itu digunakan?

Groupby adalah salah satu fungsi Pandas yang paling sering digunakan dalam analisis data. Ini digunakan untuk mengelompokkan titik data (mis. e. baris) berdasarkan nilai yang berbeda dalam kolom atau kolom tertentu . Kami kemudian dapat menghitung nilai agregat untuk grup yang dihasilkan.

Bagaimana cara mengelompokkan data CSV dengan Python?

Menggunakan Python untuk mengelompokkan data csv .
Gunakan python untuk membaca csv dan buat daftar hanya nama sungai yang unik
Buat csv individu baru berdasarkan nama sungai yang unik e. g Peterson. csv, catnip. .
Gunakan python untuk membaca csv asli, dan bergantung pada nama sungai pada baris yang sedang dibaca, tulis baris tersebut ke baris yang sesuai

Bagaimana Anda mengelompokkan banyak nilai dengan Python?

Untuk prosedur ini, langkah-langkah yang diperlukan diberikan di bawah ini. .
Impor pustaka untuk data dan visualisasinya
Buat dan impor data dengan banyak kolom
Bentuk objek groupby dengan mengelompokkan beberapa nilai
Visualisasikan data yang dikelompokkan

Postingan terbaru

LIHAT SEMUA