Menguasai Agregasi dan Pivot Data dengan Pandas
Pandas adalah pustaka python yang sangat ‘powerful’ dan banyak digunakan dalam analisis data. Salah satu fitur pandas
adalah kemampuannya untuk melakukan agregasi data sintaks yang relatif sederhana, cepat dan efisien. Dengan pandas
, kita dapat dengan mudah menghitung berbagai ringkasan statistik, mengelompokkan data berdasarkan kriteria tertentu, dan menghitung berbagai jenis agregasi seperti jumlah, rata-rata, atau median dari kelompok data. Selain itu, pandas
juga memiliki fitur untuk melakukan operasi pivot, yang memungkinkan kita mengubah struktur data dari format long menjadi wide atau dalam format tabulasi yang lebih mudah dibaca.
Pada tutorial ini akan dibahas secara lengkap bagaimana kita dapat melakukan agregasi serta pivot data, mulai dari yang sederhana hingga yang lebih kompleks.
Let’s start!
Penyiapan Data
Data dapat diunduh pada tautan berikut: fake_sales.csv.
Secara garis besar dataset berisi informasi penjualan 360 toko dari suatu perusahaan retail yang beroperasi di 3 Kota A, B dan C. Informasi kota dapat dilihat pada huruf pertama kolom store_id
yang mengindikasikan kota dari toko tersebut. Berikut penjelasan masing-masing kolom pada dataset:
store_id
berisi identitas dari setiap toko (karakter pertama A, B atau C menunjukkan lokasi kota dari toko tersebut)store_type
berisi informasi tipe dari toko apakah Big, Medium atau Smallnum_trans
menunjukkan jumlah transaksi yang dilakukan di toko tersebut pada periode tertentu (anggap saja bulan tertentu)amt_trans
menunjukkan nilai transaksi yang dilakukan ditoko tersebut pada periode tertentu (anggap saja bulan tertentu dan dalam ribu rupiah).
Python
import pandas as pd data = pd.read_csv("fake_sales.csv") print(data)
# OUTPUT store_id store_type num_trans amt_trans 0 A001 Small 715 85640.0 1 A002 Big 1904 147113.0 2 A003 Small 598 80772.0 3 A004 Small 671 43584.0 4 A005 Big 1971 226017.0 .. ... ... ... ... 355 C096 Small 977 132278.0 356 C097 Big 1636 253769.0 357 C098 Small 574 104658.0 358 C099 Small 937 99624.0 359 C100 Medium 986 137523.0 [360 rows x 4 columns]
Untuk melengkapi informasi pada dataset, kita perlu menambah 1 kolom baru yaitu city
dan berisi nama kota dengan mengambil karakter pertama kolom store_id
. Kolom city
nantinya akan sangat penting untuk tutorial ini, karena sebagian besar agregasi yang kita lakukan akan menggunakan kolom ini.
Python
# menyisipkan kolom `city` data.insert(0, "city", data["store_id"].str[0]) print(data)
# OUTPUT city store_id store_type num_trans amt_trans 0 A A001 Small 715 85640.0 1 A A002 Big 1904 147113.0 2 A A003 Small 598 80772.0 3 A A004 Small 671 43584.0 4 A A005 Big 1971 226017.0 .. ... ... ... ... ... 355 C C096 Small 977 132278.0 356 C C097 Big 1636 253769.0 357 C C098 Small 574 104658.0 358 C C099 Small 937 99624.0 359 C C100 Medium 986 137523.0 [360 rows x 5 columns]
Setelah siap, mari kita mulai mengeksplorasi berbagai bentuk agregasi dan pivot dari dataset ini!
Agregasi Total (Tanpa pengelompokan)
Kita dapat melakukan agregasi secara total pada seluruh data dan menghasilkan nilai tunggal. Pustaka pandas
menyediakan banyak metode yang dapat digunakan meliputi sum
, mean
, min
, max
, median
, std
, var
, count
dan lain sebagainya. Misalkan fungsi sum
dapat digunakan untuk menjumlahkan seluruh nilai pada baris atau kolom pandas dataframe
atau series
. Metode lainnya yaitu mean
untuk mendapatkan nilai rata-rata, min
mendapatkan nilai minimum, max
mendapatkan nilai maksimum, med
untuk mendapatkan nilai median, dan seterusnya.
Berikut beberapa contoh penggunaan metode-metode tersebut:
Python
# Jumlah transaksi dan nilai total_num = data["num_trans"].sum() total_amt = data["amt_trans"].sum() print(f"Jumlah transaksi: {total_num}") print(f"Total nilai transaksi: {total_amt}") # Rata-rata transaksi dan nilai total_num = data["num_trans"].mean() total_amt = data["amt_trans"].mean() print(f"Rata-rata jumlah transaksi per toko: {total_num:.0f}") print(f"Rata-rata nilai transaksi per toko: {total_amt:.2f}") # total observasi (menurut `store_id`) total_store = data["store_id"].count() print(f"Jumlah toko: {total_store}") # agregasi `mean` untuk beberapa kolom sekaligus averages = data[["num_trans", "amt_trans"]].mean() print("\nRata-rata menurut kolom:") print(averages)
# OUTPUT Jumlah transaksi: 389925 Total nilai transaksi: 37613193.0 Rata-rata jumlah transaksi per toko: 1083 Rata-rata nilai transaksi per toko: 104481.09 Jumlah toko: 360 Rata-rata menurut kolom: num_trans 1083.125000 amt_trans 104481.091667 dtype: float64
Berdasarkan hasil agregasi di atas, dapat dilihat berapa banyak unit toko secara keseluruhan. Selain itu diperoleh pula jumlah total transaksi dan total nilai transaksi dari seluruh toko, serta rata-rata jumlah transaksi dan rata-rata nilai transaksi dari seluruh toko.
Untuk menghasilkan agregasi data menurut kelompok tertentu, kita dapat menggunakan metode groupby
. Metode groupby
berfungsi untuk menentukan kolom mana yang akan menjadi dasar pengelompokan. Umumnya metode ini diikuti dengan metode agg
yang berisi informasi kolom mana saja serta fungsiapa yang digunakan dalam agregasi data.
Contoh 1. Jumlah transaksi menurut city
Pada contoh berikut ini, kita melakukan agregasi data sehingga menghasilkan data jumlah transaksi (num_trans
) yang dikelompokkan menurut kolom city
. Sebagai catatan, saat melakukan agregasi maka kolom yang dijadikan kelompok (yang terdapat pada metode groupby
akan menjadi indeks baris pada hasil agregasi.
Agregasi yang dilakukan akan menghasilkan dataframe baru dengan 1 kolom yaitu num_trans
sementara city
merupakan indeks baris dari dataframe tersebut.
Python
# jumlah transaksi menurut `city` num_by_city = data.groupby("city").agg({"num_trans": "sum"}) print(num_by_city)
# OUTPUT num_trans city A 135621 B 154866 C 99438
Jika diperlukan, kita dapat menjadikan city
sebagai kolom baru dan mengganti indeks barisnya dengan nilai default yaitu 0, 1, dst yaitu dengan memanggil metode reset_index()
pada hasil agregasi.
Python
tot_by_city = data.groupby("city").agg({"num_trans": "sum"}).reset_index() print(tot_by_city)
# OUTPUT city num_trans 0 A 135621 1 B 154866 2 C 99438
Contoh 2. Jumlah toko dan rata-rata transaksi menurut city
Pada contoh ini, kita melakukan agregasi yang ‘sedikit’ lebih kompleks dari sebelumnya. Agregasi yang dilakukan adalah menghitung banyaknya toko menurut kota serta rata-rata jumlah transaksi dan rata-rata nilai transaksi per toko menurut kota.
Dari hasil berikut, diperoleh bahwa jumlah toko di Kota A sebanyak 120, B sebanyak 140 dan C sebanyak 100 toko. Adapun secara rata-rata jumlah transaksi di Kota A adalah 1130 transaksi, B dan C masing-masing 1106 transaksi dan 994 transaksi. Begitu pula untuk rata-rata nilai transaksi pada setiap kota yaitu 115.435,5; 86.832,5 dan 116.043.
Python
avg_by_city = data.groupby("city").agg({"store_id" : "count", "num_trans": "mean", "amt_trans": "mean"}) print(avg_by_city)
# OUTPUT store_id num_trans amt_trans city A 120 1130.175000 115435.508333 B 140 1106.185714 86832.485714 C 100 994.380000 116043.840000
Contoh 3. Jumlah toko dan rata-rata transaksi menurut store_type
Contoh ini mirip dengan contoh sebelumnya, hanya saja kita mengelompokkannya menurut kolom store_type
.
Python
avg_by_type = data.groupby("store_type").agg({"store_id" : "count", "num_trans": "mean", "amt_trans": "mean"}) print(avg_by_type)
# OUTPUT store_id num_trans amt_trans store_type Big 116 1472.370690 142530.836207 Medium 109 1027.559633 99565.128440 Small 135 793.525926 75755.681481
Contoh 4. Agregasi dan pengurutan
Setelah melakukan proses agregasi, kita juga dapat mengurutkan hasilnya berdasarkan nilai pada kolom tertentu baik secara ascending (default) maupun descending. Mari kita ulangi agregasi seperti pada contoh 2 dengan mengurutkan hasilnya berdasarkan rata-rata nilai transaksi secara descending (dari nilai terbesar sampai terkecil).
Python
# mengurutkan hasil agregasi berdasarkan kolom `amt_trans` avg_by_city = data.groupby("city") \ .agg({"store_id": "count", "num_trans":"mean", "amt_trans": "mean"}) \ .sort_values("amt_trans", ascending=False) print(avg_by_city)
# OUTPUT store_id num_trans amt_trans city C 100 994.380000 116043.840000 A 120 1130.175000 115435.508333 B 140 1106.185714 86832.485714
Pada bagian sebelumnya, setiap kolom yang di-agregasi hanya menggunakan satu fungsi agregasi saja, misal count
, sum
atau mean
. Pustaka pandas
menyediakan fitur yang memungkinkan kita untuk menggunakan beberapa fungsi sekaligus pada setiap kolom yang diagregasi.
Contoh 5. Agregasi kolom amt_trans
menurut city
(count
, sum
, mean
, min
, max
)
Berdasarkan hasil agregasi berikut ini, kita menghasilkan banyak informasi pada kolom amt_trans
. Meliputi jumlah toko, total nilai transaksi, rata-rata nilai transaksi, nilai minimum dan maksimum transaksi untuk masing-masing Kota A, B dan C.
Python
summary_by_city = data.groupby("city") \ .agg({"amt_trans": ["count", "sum", "mean", "min", "max"]}) print(summary_by_city)
# OUTPUT amt_trans count sum mean min max city A 120 13852261.0 115435.508333 36740.0 291533.0 B 140 12156548.0 86832.485714 17700.0 179215.0 C 100 11604384.0 116043.840000 23193.0 329497.0
Pada contoh di atas, karena agregasi kolom menggunakan beberapa fungsi maka pandas
secara otomatis menjadikan kolom-kolom berupa multi-index. Hal ini berarti setiap kolom diidentifikasikan dengan lebih dari 1 indeks. Sebagai contoh, untuk mengakses kolom sum
kita tidak dapat langsung menggunakan sum
melainkan (amt_trans, sum)
. Untuk lebih jelasnya kita dapat mengakses properti columns
pada objek summary_by_city
. Adapun untuk mengurutkan data berdasarkan kolom tertentu, maka kita harus menggunakan indeks kolom tersebut secara lengkap.
Python
# menampilkan daftar kolom pada hasil agregasi print(summary_by_city.columns) print(f"\n{'':-^60}\n") # mencetak '-' sebanyak 60x # misal akan diurutkan berdasarkan (`amt_trans`, `mean`) sort_idx = ('amt_trans', 'mean') summary_by_city = summary_by_city.sort_values(sort_idx, ascending=False) print(summary_by_city)
# OUTPUT MultiIndex([('amt_trans', 'count'), ('amt_trans', 'sum'), ('amt_trans', 'mean'), ('amt_trans', 'min'), ('amt_trans', 'max')], ) ------------------------------------------------------------ amt_trans count sum mean min max city C 100 11604384.0 116043.840000 23193.0 329497.0 A 120 13852261.0 115435.508333 36740.0 291533.0 B 140 12156548.0 86832.485714 17700.0 179215.0
Contoh 6. Agregasi kolom num_trans
, amt_trans
menurut store_type
(count
, sum
, mean
)
Contoh di bawah ini menunjukkan agregasi yang melibatkan 3 kolom dimana masing-masing kolom juga diagregasi dengan beberapa fungsi. Fungsi count
digunakan untuk mendapatkan jumlah toko menurut store_type
(menggunakan kolom store_id
). Adapun untuk kolom num_trans
dan amt_trans
masing-masing menampilkan hasil agregasi menggunakan fungsi sum
dan mean
.
Python
summary_by_type = data.groupby("store_type") \ .agg({"store_id" : "count", "num_trans": ["sum","mean"], "amt_trans": ["sum","mean"]}) print(summary_by_type.columns) print(f"\n{'':-^70}\n") print(summary_by_type)
# OUTPUT MultiIndex([( 'store_id', 'count'), ('num_trans', 'sum'), ('num_trans', 'mean'), ('amt_trans', 'sum'), ('amt_trans', 'mean')], ) ---------------------------------------------------------------------- store_id num_trans amt_trans count sum mean sum mean store_type Big 116 170795 1472.370690 16533577.0 142530.836207 Medium 109 112004 1027.559633 10852599.0 99565.128440 Small 135 107126 793.525926 10227017.0 75755.681481
Contoh 7. Mengganti nama-nama kolom Multiindex menjadi flat
Berdasarkan kode pada Contoh 6 hasil agregasi akan menghasilkan kolom dengan multi indeks. Jika memang diperlukan, kita dapat merubah nama-nama kolom tersebut menjadi flat sesuai nama yang diinginkan. Caranya cukup dengan memperbarui nilai properti columns
pada objek summary_by_type
yang diperoleh sebelumnya dengan nama baru.
Python
summary_by_type.columns = ["num_stores", "tot_trans", "avg_trans", "tot_amt", "avg_amt"] print(summary_by_type)
# OUTPUT num_stores tot_trans avg_trans tot_amt avg_amt store_type Big 116 170795 1472.370690 16533577.0 142530.836207 Medium 109 112004 1027.559633 10852599.0 99565.128440 Small 135 107126 793.525926 10227017.0 75755.681481
Dalam melakukan agregasi menggunakan pandas
kita dapat mengelompokkan tidak hanya berdasarkan satu kelompok saja, namun dengan dua atau lebih kelompok. Misalkan, pada kode berikut kita akan menghitung banyaknya toko, jumlah transaksi dan total nilai transaksi menurut kota dan tipe toko.
Contoh 8. Agregasi menurut city
dan store_type
Agregasi menurut kode berikut ini menghasilkan informasi yang dikelompokkan berdasarkan city
serta store_type
. Dari sini kita dapat mengetahui berapa jumlah toko yang ada pada masing-masing kota berdasarkan tipe tokonya. Bagitu pula informasi lainnya yaitu banyaknya transaksi dan nilai transaksi menurut kota dan jenis toko.
Sama seperti bagian-bagian sebelumnya, jika diperlukan kita dapat pula melakukanpengurutan maupun merubah nama kolom pada data hasil agregasi.
Python
tot_by_city_by_type = data.groupby(["city", "store_type"]) \ .agg({"store_id" : "count", "num_trans": "sum", "amt_trans": "sum"}) print(tot_by_city_by_type)
# OUTPUT store_id num_trans amt_trans city store_type A Big 39 61693 6453130.0 Medium 40 43534 4235584.0 Small 41 30394 3163547.0 B Big 45 66430 5109216.0 Medium 41 42724 3427054.0 Small 54 45712 3620278.0 C Big 32 42672 4971231.0 Medium 28 25746 3189961.0 Small 40 31020 3443192.0
Contoh 9. Agregasi menurut city
dan store_type
(dengan beberapa fungsi)
Pada contoh ini, kita melakukan agregasi dengan 2 kelompok yaitu city
dan store_type
serta pada kolom num_trans
dan amt_trans
di-agregasi menggunakan 2 fungsi. Selain itu kita menambahkan metode reset_index()
sehingga (city
, store_type)
yang sebelumnya merupakan indeks baris dari hasil agregasi menjadi 2 kolom biasa.
Python
summary_by_city_by_type = data.groupby(["city", "store_type"]) \ .agg({"store_id" : "count", "num_trans": ["sum", "mean"], "amt_trans": ["sum", "mean"]}) \ .reset_index() colnames = ["city", "store_type", "num_stores", "tot_trans", "avg_trans", "tot_amt", "avg_amt"] # merubah nama-nama kolom summary_by_city_by_type.columns = colnames print(summary_by_city_by_type)
# OUTPUT city store_type num_stores tot_trans avg_trans tot_amt avg_amt 0 A Big 39 61693 1581.871795 6453130.0 165464.871795 1 A Medium 40 43534 1088.350000 4235584.0 105889.600000 2 A Small 41 30394 741.317073 3163547.0 77159.682927 3 B Big 45 66430 1476.222222 5109216.0 113538.133333 4 B Medium 41 42724 1042.048780 3427054.0 83586.682927 5 B Small 54 45712 846.518519 3620278.0 67042.185185 6 C Big 32 42672 1333.500000 4971231.0 155350.968750 7 C Medium 28 25746 919.500000 3189961.0 113927.178571 8 C Small 40 31020 775.500000 3443192.0 86079.800000
Agregasi dengan Fungsi Buatan
Selain menggunakan fungsi-fungsi standar yang tersedia, jika diperlukan maka proses agregasi dapat juga menggunakan fungsi yang kita definisikan sendiri.
Contoh 10. Agregasi (rata-rata) dengan pembulatan angka desimal
Pada contoh berikut misalkan kita membuat fungsi untuk menghitung rata-rata dimana hasilnya dibulatkan pada nilai desimal tertentu. Nilai defaultnya adalah 0 atau dibulatkan ke bilangan bulat, namun parameter ini dapat diatur dengan nilai lainnya.
Misalkan untuk kolom num_trans
kita ingin membulatkan tanpa nilai desimal. Karena nilai default untuk dec
adalah 0, maka kita dapat langsung menuliskan nama fungsi rounded_mean
. Adapun untuk kolom amt_trans
misalkan akan kita bulatkan hingga 1 desimal. Karena kita perlu mengisi argumen untuk parameter dec
maka kita dapat membuat fungsi lambda
dimana di dalamnya akan memanggil fungsi rounded_mean
dan mengatur nilai parameter dec=1
.
Python
import numpy as np # fungsi untuk membulatkan nilai rata-rata dengan jumlah desimal tertentu def rounded_mean (column, dec=0): return np.round(column.mean(), dec) sum_by_city_by_type = data.groupby(["city", "store_type"]) \ .agg({"num_trans": rounded_mean, "amt_trans": lambda x: rounded_mean(x, dec=1)}) \ .reset_index() print(sum_by_city_by_type)
# OUTPUT city store_type num_trans amt_trans 0 A Big 1582.0 165464.9 1 A Medium 1088.0 105889.6 2 A Small 741.0 77159.7 3 B Big 1476.0 113538.1 4 B Medium 1042.0 83586.7 5 B Small 847.0 67042.2 6 C Big 1334.0 155351.0 7 C Medium 920.0 113927.2 8 C Small 776.0 86079.8
Contoh 11. Agregasi perbandingan transaksi terbesar dan terkecil menurut kolom city
Pada contoh berikut, kita membuat fungsi yang mengukur perbandingan antara nilai terbesar dibandingkan dengan nilai terkecilnya. Ketika fungsi ini kita terapkan pada agregasi kolom num_trans
dan amt_trans
maka akan diperoleh hasil perbandingan transaksi terbesar terhadap transaksi terkcilnya.
Dari hasil yang diperoleh dapat kita simpulkan misalkan untuk Kota C, perbandingan transaksi dari toko dengan transaksi terbesar adalah 3.6 kali lebih banyak dibandingkan toko dengan transaksi paling sedikitnya. Serta, Perbandingan nilai transaksi pada toko dengan nilai transaksi terbesar di Kota C adalah 14.2 kali lebih besar dibandingkan toko dengan nilai transaksi terkecil.
Python
# fungsi untuk membandingkan nilai terbesar dan terkecil def get_ratio_max_min(column): min_val = column.min() max_val = column.max() return np.round(max_val/min_val, 1) minmax_diff_by_city = data.groupby("city") \ .agg({"num_trans": get_ratio_max_min, "amt_trans": get_ratio_max_min}) \ .reset_index() print(minmax_diff_by_city)
# OUTPUT city num_trans amt_trans 0 A 3.9 7.9 1 B 2.9 10.1 2 C 3.6 14.2
Agregasi dan Pivot (agg + pivot)
Metode pivot
pada dasarnya digunakan untuk merubah data dari format long menjadi wide. Hasil agregasi menggunakan metode groupby
dan agg
merupakan contoh data dengan format long. Untuk itu, kita dapat menggunakan metode pivot
untuk mereformat hasil agregasi menjadi wide.
Contoh 12. Agregasi dan pivot jumlah toko menurut kolom city
dan store_type
Dari proses agregasi berikut, kita dapat merubah format agregasi yang memanjang ke bawah menggunakan metode pivot
. Misalkan, kolom store_type
kita reformat sehingga membentuk beberapa kolom sesuai dengan masing-masing kategori pada kolom ini yaitu Big
, Medium
dan Small
. Proses sebaliknya juga dapat dilakukan dengan mengisi parameter index='store_type'
dan parameter columns='city'
.
Python
# agregasi data count_by_city_by_type = data.groupby(["city", "store_type"]) \ .agg({"store_id" : "count"}) \ .reset_index() print(count_by_city_by_type) print(f"\n{'':-^40}\n") # reformat long-to-wide data_pivot = pd.pivot(count_by_city_by_type, index='city', columns='store_type', values='store_id') print(data_pivot)
# OUTPUT city store_type store_id 0 A Big 39 1 A Medium 40 2 A Small 41 3 B Big 45 4 B Medium 41 5 B Small 54 6 C Big 32 7 C Medium 28 8 C Small 40 ---------------------------------------- store_type Big Medium Small city A 39 40 41 B 45 41 54 C 32 28 40
Contoh 13. Agregasi dan pivot jumlah dan nilai transaksi menurut toko dan lokasi
Dalam melakukan pivot, kita dapat menggunakan beberapa nilai sekaligus. Seperti contoh berikut, dimana kolom-kolom num_trans
dan amt_trans
masing-masing menjadi 3 kolom terpisah menurut kolom store_type
.
catatan: parameter columns
pada metode pivot
juga dapat diisi dengan lebih dari satu kolom (baca: Reformat Pandas Dataframe ‘Long to Wide’)
Python
sum_by_city_by_type = data.groupby(["city", "store_type"]) \ .agg({"num_trans": "sum", "amt_trans": "sum"}) \ .reset_index() print(sum_by_city_by_type) print(f"\n{'':-^60}\n") data_pivot = pd.pivot(sum_by_city_by_type , index='city', columns='store_type', values=['num_trans', 'amt_trans']) print(data_pivot)
# OUTPUT city store_type num_trans amt_trans 0 A Big 61693 6453130.0 1 A Medium 43534 4235584.0 2 A Small 30394 3163547.0 3 B Big 66430 5109216.0 4 B Medium 42724 3427054.0 5 B Small 45712 3620278.0 6 C Big 42672 4971231.0 7 C Medium 25746 3189961.0 8 C Small 31020 3443192.0 ------------------------------------------------------------ num_trans amt_trans store_type Big Medium Small Big Medium Small city A 61693.0 43534.0 30394.0 6453130.0 4235584.0 3163547.0 B 66430.0 42724.0 45712.0 5109216.0 3427054.0 3620278.0 C 42672.0 25746.0 31020.0 4971231.0 3189961.0 3443192.0
Agregasi dan Pivot (pivot_table)
Pada contoh sebelumnya, untuk proses pivot menggunakan metode pivot
kita melakukan agregasi pada dataframe terlebih dahulu. Sebenarnya pandas
juga menyediakan metode pivot_table
yang bekerja mirip seperti pivot table pada Microsoft Excel. Melalui metode ini, kita tidak perlu melakukan agregasi dan pivot secara terpisah, karena metode pivot_table
memungkinkan kita menggunakan fungsi-fungsi agregasi secara langsung berdasarkan dataframe aslinya.
Berikut ini adalah contoh penggunaan pivot_table
untuk menghasilkan output yang sama seperti pada contoh 12 dan 13
Python
# Contoh 12 pivot_12 = pd.pivot_table(data, values='store_id', index='city', columns='store_type', aggfunc="count") print(pivot_12) print(f"\n{'':-^60}\n") pivot_13 = pd.pivot_table(data, values=['amt_trans', 'num_trans', ], index='city', columns='store_type', aggfunc={'num_trans':"sum", 'amt_trans': "sum"}) print(pivot_13)
# OUTPUT store_type Big Medium Small city A 39 40 41 B 45 41 54 C 32 28 40 ------------------------------------------------------------ amt_trans num_trans store_type Big Medium Small Big Medium Small city A 6453130.0 4235584.0 3163547.0 61693 43534 30394 B 5109216.0 3427054.0 3620278.0 66430 42724 45712 C 4971231.0 3189961.0 3443192.0 42672 25746 31020
Baca juga: Tabulasi Data dengan Pivot Table Pandas
Selamat mencoba!!!
Tutorial Pandas