Python Data Science : Pandas — Part 2
Filtering, Sorting dan Grouping Dataframe
Hai, kita lanjutkan kembali bahasan mengenai Library Pandas untuk Data Science. Tulisan Part 1 bisa di baca disini.
Untuk mengikuti hands on code berikut ini, anda harus mengikuti tutorial di Part 1. Sebelumnya kita sudah mampu membaca dan menyimpan dataset dalam bentuk CSV, JSON, TXT sampai EXCEL serta memahami konsep Dataframe dalam Pandas. Berikut ini kita akan coba melakukan Filtering, Grouping dan Sorting Data Frame menggunakan Pandas.
Pandas Filtering
Pertama kita baca data CSV (COVID19_line_list_data_compact.csv) yang kita sudah simpan di tutorial part 1.
COVID19 = pd.read_csv("COVID19_line_list_data_compact.csv")COVID19
Untuk memilih 1 kolom pada Dataframe, gunakan [] bracket, misal kita ingin melihat umur pasien COVID-19.
Ages = COVID19["AGE"]Ages.head()
Setiap kolom pada Dataframe dinamakan Series, sebagai kolom pada Dataframe, Series menjadi bagian dari object Dataframe, kita dapat melihatnya dengan cara berikut,
type(COVID19["AGE"])
konsep Series pada Dataframe mirip dengan List pada pemrograman dasar Python. Kita datap melihat ukuran data dari Series dengan cara berikut,
COVID19["AGE"].shape
Kita dapat juga mengambil lebih dari satu Series pada Dataframe, misal selain menampilakn umur [“AGE”] kita juga akan menampilkan negara asal [“COUNTRY”],
COVID19[["AGE", "COUNTRY"]]
- Ingat, ketika akan menampilkan lebih dari satu kolom (Series), gukanan double bracket [[]].
Cek kembali tipe data dari multiple Series yang kita buat dengan cara berikut,
type(COVID19[["AGE", "COUNTRY"]])
Bisa kita lihat bahwa multiple Series dalam Pandas merupakan Dtaframe. Ukuran Dataframe ini dapat dicek kembali dengan cara yang sama seperti sebelumnya,
COVID19[["AGE", "COUNTRY"]].shape
Filtering Specific Row
Selanjutya kita akan coba melakukan Filtering sederhana, kita akan coba melakukan filtering pada baris data tertentu, misal pada kolom AGE kita ingin menampilkan data yang umurnya diatas 45 tahun,
COVID19_ABOVE_45 = COVID19[COVID19["AGE"] > 45]COVID19_ABOVE_45.head()
Kondisi dalam bracket [] akan memfilter apakah tiap row dalam Dataframe memiliki “AGE” > 45 atau tidak, jika iya bernilai True, jika tidak bernilai False.
Kita bisa membandingkan ukuran dataframe hasil filter AGE,
COVID19_ABOVE_45.shape
Dapat dilihat bahwa dari 1085 suspect COVID-19 diseluruh dunia, terdapat 482 kasus dengan umur diatas 45 tahun.
Selanjutnya jika kita ingin mengetahui data suspect yang berasal dari China dan Italy kita dapat menggunakan filtering berikut,
COVID19[COVID19["COUNTRY"].isin(["China", "Italy"])]
Function .isin() sama seperti filtering sebelumnya, akan menghasilkan nilai True jika kolom dalam bracket [] memiliki nilai yang sama pada filtering list [“China”, “Italy”].
Filtering diatas equivalen dengan filtering row berikut,
COVID19[(COVID19["COUNTRY"] == "China") | (COVID19["COUNTRY"] == "Italy")]
- Ketika kita hendak menggabungkan lebih dari satu conditional statement, jangan lupa untuk menggunakan bracket (), selanjutnya kita tidak bisa menggunakan or/and operator untuk menggabuankan conditional statement, kita dapat menggunakan | untuk or, & untuk and.
Pandas dapat melakukan Filtering untuk data yang tidak Null / kosong dengan menggunakan function .notna(),
AGE_NOT_NA = COVID19[COVID19["AGE"].notna()]AGE_NOT_NA
Terlihat bahwa dari 1085 suspect, hanya 843 data yang umurnya tercatat.
Filtering Specific Row & Column
Sekarang kita akan menampilkan nama Negara asal suspect yang berumur diatas 45 tahun,
COUNTRY_ABOVE_45 = COVID19.loc[COVID19["AGE"] > 45, "COUNTRY"]COUNTRY_ABOVE_45
Kita juga dapat mengambil data dari dataframe dengan menggunakan rentang kolom dan baris. Misalnya kita ingin menampilkan data dari dataframe kolom 3 sampai 6 pada baris 10 sampai 15,
COVID19.iloc[9:15, 2:6]
Fungsi .iloc() pada Pandas dapat digunakan untuk menarik data spesifik baris dan kolom pada Dataframe berdasarkan index lokasi.
- Row pada dataframe dimulai dari index 0, sehingga jika kita akan mengambil data dimulai baris ke 10, maka sebenarnya yang diambil adalah index 9, pada kolom pertama Dataframe diisi oleh kolom index Dataframe ber-index 0, sehingga jika kita ingin mengambil kolom 3, sebenarnya kita ingin mengambil kolom ke 2.
Sorting Dataframe
Pandas dapat melakukan sorting data dengan memanfaatkan function .sort_values(). Berikut contoh untuk melakukan sorting AGE Dataframe COVID-19 secara ascending (default),
COVID19.sort_values(by=["AGE"])
Sorting descending bisa dilakukan dengan menambahkan parameter ascending=False,
COVID19.sort_values(by=["AGE"], ascending=False)
Teknik sort diatas dapat dipergunakan untuk data alphabetical maupun number, jika kita ingin melakukan sorting pada kolom DATE atapun DATETIME, kita terlebih dahulu harus memastikan jika kolom DATE yang kita miliki memiliki tipe data DATE bukan string.
Kita cek data type tiap kolom pada Dataframe dengan cara berikut,
COVID19.dtypes
Terlihat bahwa kolom REPORTING_DATE memiliki data type object, bukan DATETIME, sehingga kita perlu setup kolom tersebut agar data-typenya DATETIME.
COVID19["REPORTING_DATE"] = COVID19["REPORTING_DATE"].astype('datetime64[ns]')
Setelah itu kita cek kembali data-typenya,
Selanjutnya kita dapat melakukan sorting pada kolom REPORTING_DATE secara Ascending,
COVID19.sort_values(by=["REPORTING_DATE"])
Maupun secara descending,
COVID19.sort_values(by=["REPORTING_DATE"], ascending=False)
Selain itu juga dapat melakukan sorting multiple column, misalnya selain menggunakan REPORTING_DATE, kita juga ingin sorting dengan AGE,
COVID19.sort_values(by=["REPORTING_DATE", "AGE"])
kita juga dapat memvariasikan sort order masing-masing kolom dengan cara berikut,
COVID19.sort_values(by=["REPORTING_DATE", "AGE"] , ascending=[False, True])
Terlihat bahwa kolom REPORTING_DATE disorting secara descending, sementara kolom AGE disorting secara ascending.
Grouping Dataframe
Pandas juga memfasilitasi grouping data, kita dapat melakukan pengelompokan data berdasarkan nama tertentu dan menghitung statistiknya, misalkan pada dataset COVID-19, kita dapat melakukan grouping pernegara untuk selanjutnya dihitung total case tiap negara.
COVID19_GROUPBY_COUNTRY = COVID19.groupby("COUNTRY")
Hasil grouping tersebut dapat menghitung total case tiap negara dengan fungsi .count(),
COVID19_GROUPBY_COUNTRY["COUNTRY"].count()
Dapat juga dicari rata-rata umur suspect ditiap negara dengan menggunakan fungsi .mean() pada kolo AGE,
COVID19_GROUPBY_COUNTRY[["COUNTRY", "AGE"]].mean()
Secara default Pandas groupby akan melakukan sorting, untuk mematikan sorting saat proses groupby dapat dilakukan dengan menambahkan parameter sort=False,
COVID19_GROUPBY_COUNTRY = COVID19.groupby("COUNTRY", sort=False)
Sehingga saat kita mencari rata-rata umur suspect tiap negara, datanya menjadi tidak berurutan, ini akan meningkatkan kecepatan proses grouping data.
Mengambil data utuk spesifik group dengan fungsi .get_group(). Dari hasil grouping by COUNTRY diatas, kita dapat mengambil data hasil grouping untuk tiap COUNTRY name, misal kita ingin mengambil data untuk satu group COUNTRY ‘Italy’,
COVID19_GROUPBY_COUNTRY.get_group('Italy')
Setelah itu kita dapat melakukan multiple groupby, misalnya pada dataset COVID-19 kita ingin melakukan grouping berdasarkan COUNTRY dan GENDER,
COVID19_GROUPBY_COUNTRY_GENDER = COVID19.groupby(["COUNTRY", "GENDER"])
Selanjutnya kita hitung jumlah case pada tiap COUNTRY untuk setiap GENDER,
COVID19_GROUPBY_COUNTRY_GENDER["GENDER"].count()
Selain itu kita dapat mengkombinasikan groupby() dengan sort_values() yang sebelumnya kita pelajari, sehingga jika kita memiliki Datafarme COVID-19 grouping by COUNTRY dan GENDER, kita dapat melakukan sorting data untuk total case dengan GENDER terbanyak (descending).
COVID19_GROUPBY_COUNTRY_GENDER["GENDER"].count() \
.reset_index(name='count') \
.sort_values(['count'], \
ascending=False)
- reset_index() digunakan untuk mengembalikan index Dataframe ke 0
Nah sekian untuk bahasan kali ini mengenai basic filtering, sorting hingga grouping Dataframe menggunakan Pandas Library, selanjutnya akan dibahas tentang joining & Merging DataFrame.
Terima Kasih
Sumber
- https://pandas.pydata.org/pandas-docs/stable/getting_started/intro_tutorials/03_subset_data.html#min-tut-03-subset
- https://datatofish.com/sort-pandas-dataframe/
- https://towardsdatascience.com/sorting-data-frames-in-pandas-a5a3af6f346a
- https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html
- https://stackoverflow.com/questions/40454030/count-and-sort-with-pandas