About Me

Hai, saya Rosihan Ari Yuana. Saya sehari-hari adalah mengajar di Universitas Sebelas Maret.

Bidang riset saya tentang adaptive learning, computer aided learning, dan datascience

Selain itu, saya juga seorang penulis buku dan blogger.

More about me...

  • Home
  • /
  • Data Science
  • /
  • Generate CSV berdasarkan Kategori di Python dengan Pandas, OS, dan NumPy

Generate CSV berdasarkan Kategori di Python dengan Pandas, OS, dan NumPy

Salah satu kasus yang sering dihadapi seorang Data Scientist adalah diberikan dataset yang stukturnya tidak cocok dengan kebutuhan untuk membuat Machine Learning Model. Sehingga perlu adanya penanganan manual yang termasuk dalam tahap pre-processing data.

Pada artikel ini kita akan membahas bagaimana mengenerate file CSV berdasarkan kategori dengan Python menggunakan library Pandas, OS, dan NumPy.

Untuk lebih memperjelas pembahasan akan diberikan sebuah studi kasus, yaitu sebuah dataset dengan struktur folder file sebagai berikut:

Struktur Folder File Dataset

Dataset tersebut terdiri dari 3 folder program studi, yaitu Teknik Informatika, Teknik Kimia, dan Teknik Mesin.

Di dalam masing-masing folder, terdapat sebuah file dataset ‘DaftarNilaiSemuaMatakuliah.csv’ yang berisi nilai mahasiswa dengan berbagai feature (contoh: TahunMasuk, Semester, Nilai, StatusStudi dll.), seperti pada gambar di bawah ini.

Isi Folder
Struktur Dataset

Apabila Anda ingin mendapatkannya, file dataset tersebut bisa diunduh di link berikut:

Selanjutnya akan dibuat dataset baru per mata kuliah untuk setiap program studi dan di dalam dataset tersebut ditambahkan satu kolom baru yaitu skala nilai huruf dari A s/d E.

Untuk melakukan hal tersebut, paling tidak ada 3 langkah utama yang perlu direncanakan, yaitu:

  • Pertama, bagaimana menangani dataset menjadi dataset per “MataKuliah”,
  • Kedua, bagaimana membuat kolom “SkalaNilai” huruf berdasarkan data dari kolom “Nilai”,
  • Ketiga, bagaimana membuat code untuk melakukan loop dari langkah 1 dan 2 yang nantinya secara otomatis akan memproses file dataset untuk setiap program studi

Import file CSV ke Dataset

Dalam rangka membuat dataset per mata kuliah. Langkah pertama adalah mengambil dataset awal dengan code sebagai berikut:

import pandas as pd
df = pd.read_csv('D:/Latihan/ProgramStudi/Teknik Mesin/DaftarNilaiSemuaMataKuliah.csv')

Path file csv diasumsikan diletakkan dalam direktori D:/Latihan

Dalam code di atas digunakan Pandas library untuk membaca data file CSV . Untuk percobaan pertama digunakan dataset program studi Teknik Mesin.

Generate Kolom Baru dan Input Data ke CSV Dataset

Selanjutnya adalah membuat kolom “SkalaNilai” yang berisi (‘A’,’B’,’C’,’D’,’E’) dari kolom nilai yang isinya (0,…,100). Caranya adalah seperti dibawah ini:

import numpy as np
conditions = [
    (df['Nilai']<20),
    (df['Nilai']>=20) & (df['Nilai']<40),
    (df['Nilai']>=40) & (df['Nilai']<60),
    (df['Nilai']>=60) & (df['Nilai']<80),
    (df['Nilai']>=80)]
    
    # list skala nilai
    choices = ['E','D','C','B','A']

    # proses mapping kondisi dg skala nilai
    df['SkalaNilai'] = np.select(conditions, choices)

Perhatikan kode di atas! Pada kode tersebut dibuat conditional statement yang berisi batasan-batasan tiap kategori nilai dalam variabel conditions. Misalkan dalam hal ini ketentuan skala nilai hurufnya adalah sbb:

  • Jika 0 < NIlai < 20, maka SkalaNilai = ‘E’
  • Jika 20 <= Nilai < 40, maka SkalaNilai = ‘D’
  • Jika 40 <= Nilai < 60, maka SkalaNilai = ‘C’
  • Jika 60 <= Nilai < 80, maka SkalaNilai = ‘B’
  • Jika 80 <= Nilai, maka SkalaNilai = ‘A’

Kemudian dibuat list yang berisi skala nilai dalam variabel choices. Lalu dibuat kolom baru yang isinya menggunakan NumPy library untuk input datadi tiap baris berdasarkan kolom “Nilai” di baris tersebut.

Looping Generate Dataset Baru

Selanjutnya adalah bagaimana membuat loop untuk melakukan 2 langkah di atas di semua folder program studi. Yang perlu diketahui sebelum itu adalah apa saja yang perlu dilakukan dalam looping. Pertama adalah membuat folder baru di dalam folder program studi yaitu folder “PerMataKuliah”. Caranya adalah sebagai berikut:

import os
newpath = 'D:/Latihan/ProgramStudi/Teknik Mesin/PerMataKuliah'
os.makedirs(newpath)

Kemudian untuk membuat dataset baru yang isinya hanya satu kategori mata kuliah, misalnya ‘Termodinamika’. Caranya adalah sebagai berikut:

df_course = df.loc[(df['MataKuliah']=='Termodinamika')]
df_course.to_csv('D:/Latihan/ProgramStudi/Teknik Mesin/PerMataKuliah/Termodinamika.csv')

Dengan code ini, akan tercipta dataset mata kuliah “Termodinamika” dalam folder “PerMataKuliah” yang sudah dibuat sebelumnya di dalam folder “Teknik Mesin”.

Setelah terbentuk code untuk melakukan tugas, selanjutnya adalah membuat looping. Ide di atas digeneralisir untuk setiap mata kuliah. Sehubungan dengan akan dibuatnya loop di tiap kategori di kolom “ProgramStudi” dan “MataKuliah”, maka perlu dibuat variabel yang berisi list kategori dari kolom “ProgramStudi” dan “MataKuliah” .

Pertama, folder “Program Studi” perlu dikonversi menjadi list daftar nama program studi. Itu bisa dilakukan dengan OS library sebagai berikut:

import os
folder_list = os.listdir('D:/Latihan/ProgramStudi/')

Code tersebut akan menghasilkan list folder program studi sebagai berikut:

['Teknik Informatika','Teknik Kimia','Teknik Mesin']

Selanjutnya dibuat list mata kuliah dari dataset. Caranya adalah sebagai berikut:

index_list = df['MataKuliah'].value_counts().index.tolist()

Jika code tersebut di-run di dataset “Teknik Mesin”, maka akan menghasilkan list folder program studi sebagai berikut:

['Termodinamika','MekanikaFluida','GetaranMekanis']

Kemudian susunan utuh code untuk membuat dataset per mata kuliah di setiap program studi dan membuat kolom “SkalaNilai” adalah sebagai berikut:

import pandas as pd
import os
import numpy as np

folder_list = os.listdir('D:/Latihan/ProgramStudi/')

for i in folder_list:
    df = pd.read_csv('D:/Latihan/ProgramStudi/'+i+'/DaftarNilaiSemuaMataKuliah.csv')
    
    conditions = [
    (df['Nilai']<20),
    (df['Nilai']>=20) & (df['Nilai']<40),
    (df['Nilai']>=40) & (df['Nilai']<60),
    (df['Nilai']>=60) & (df['Nilai']<80),
    (df['Nilai']>=80)]
    choices = ['E','D','C','B','A']
    df['SkalaNilai'] = np.select(conditions, choices)
    
    index_list = df['MataKuliah'].value_counts().index.tolist()
    
    newpath = 'D:/Latihan/ProgramStudi/'+i+'/PerMataKuliah'
    os.makedirs(newpath)
    
    for j in index_list:
        df_course = df.loc[(df['MataKuliah']==j)]
        df_course.to_csv('D:/Latihan/ProgramStudi/'+i+'/PerMataKuliah/'+j+'.csv')

Tambahan yang diberikan di code akhir ini hanyalah memasukkan looping. Dari code diatas, looping yang pertama di line ke-7 dengan menggunakan variabel folder_list yang telah dibuat sebelumnya. Looping melakukan tugas di tiap nama program studi yang dilambangkan dalam variabel i.

Looping yang kedua adalah di line ke-24. Di line ke-24 dilakukan looping per mata kuliah dengan code yang sama seperti yang sudah dibuat sebelumnya. Ini dilakukan dengan list yang sudah di buat di variabel index_list. Nama mata kuliah dilambangkan dengan variabel j.

Dengan code diatas maka akan menghasilkan data seperti tampilan di bawah ini:

File Dataset Per Matakuliah Per Prodi
Struktur Dataset Output dengan Tambahan Kolom SkalaNilai

Secara lengkap, file hasil pengolahan di atas dapat diunduh di bawah ini.

Demikian tutorial generate CSV berdasarkan kategori dengan Python menggunakan Pandas, OS, dan NumPy library. Semoga bermanfaat.


Article by Request

Anda belum memahami konsep pemrograman PHP Native, Python, Java, atau SQL? atau Anda belum punya ide penyelesaian dari studi kasus yang dihadapi sampai saat ini.

Silakan manfaatkan layanan Article by Request di blog ini.


Bagikan artikel ini jika bermanfaat !

Alumni dari Pendidikan Teknik Informatika dan Komputer, Universitas Sebelas Maret. Master Graduate of Computer Science and Information Engineering di National Central University, Taiwan. Sekarang bekerja sebagai Data Analyst di Teaching Excellence Center Divison, National Yunlin University of Science and Technology, Yunlin, Taiwan.

Leave a Reply