Python Data Science : Pandas — Part 2

Muhammad Yunus
7 min readApr 4, 2020

--

Filtering, Sorting dan Grouping Dataframe

source [link]

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
Dataframe dari file CSV COVID19_line_list_data_compact.csv

Untuk memilih 1 kolom pada Dataframe, gunakan [] bracket, misal kita ingin melihat umur pasien COVID-19.

Ages = COVID19["AGE"]Ages.head()
Select single column dari Dataframe

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"])
Series merupakan bagian object Dataframe Pandas

konsep Series pada Dataframe mirip dengan List pada pemrograman dasar Python. Kita datap melihat ukuran data dari Series dengan cara berikut,

COVID19["AGE"].shape
Series data size

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"]]
Menampilkan lebih dari satu Series
  • 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"]])
Cek type multiple Series

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
Size multiple Series (Dataframe)

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()
Filter specific row

Kondisi dalam bracket [] akan memfilter apakah tiap row dalam Dataframe memiliki “AGE” > 45 atau tidak, jika iya bernilai True, jika tidak bernilai False.

Condition inside selection bracket []

Kita bisa membandingkan ukuran dataframe hasil filter AGE,

COVID19_ABOVE_45.shape
Size Dataframe hasil filtering AGE > 45

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
Filtering Age not null

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
menampilkan Negara asal suspect yang umurnya diatas 45 tahun

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]
Menampilkan Dataframe dari kolom 3 sampai 6 pada baris 10 sampai 15

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 Dataframe by Age ASC

Sorting descending bisa dilakukan dengan menambahkan parameter ascending=False,

COVID19.sort_values(by=["AGE"], ascending=False)
Sorting by Age DESC

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
cek data type seluruh kolom pada Dataframe

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,

REPORTING_DATE dengan data type datetime64

Selanjutnya kita dapat melakukan sorting pada kolom REPORTING_DATE secara Ascending,

COVID19.sort_values(by=["REPORTING_DATE"])
Sorting REPORTING_DATE ASC

Maupun secara descending,

COVID19.sort_values(by=["REPORTING_DATE"], ascending=False)
Sorting REPORTING_DATE DESC

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"])
Sorting multiple kolom

kita juga dapat memvariasikan sort order masing-masing kolom dengan cara berikut,

COVID19.sort_values(by=["REPORTING_DATE", "AGE"] , ascending=[False, True])
Sorting multiple kolom dengan variasi sort order

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()
menampilkan total case tiap negara

Dapat juga dicari rata-rata umur suspect ditiap negara dengan menggunakan fungsi .mean() pada kolo AGE,

COVID19_GROUPBY_COUNTRY[["COUNTRY", "AGE"]].mean()
Mencari rata-rata umur suspect ditiap negara

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.

Tanpa sort akan mempercepat proses Grouping

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')
get group by country name

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()
multiple grouping and 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
menggabungkan groupby() dengan sort_values()

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

  1. https://pandas.pydata.org/pandas-docs/stable/getting_started/intro_tutorials/03_subset_data.html#min-tut-03-subset
  2. https://datatofish.com/sort-pandas-dataframe/
  3. https://towardsdatascience.com/sorting-data-frames-in-pandas-a5a3af6f346a
  4. https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html
  5. https://stackoverflow.com/questions/40454030/count-and-sort-with-pandas

--

--

Muhammad Yunus

IoT Engineer, Software Developer & Machine Learning Enthusiast