CSV (Comma-Separated Values) adalah format pertukaran data paling umum di dunia kerja: laporan penjualan diekspor dari aplikasi kasir, daftar pelanggan diekspor dari database, dan hasil survei diunduh dari aplikasi formulir, semuanya biasanya berbentuk file .csv. pandas menyediakan satu fungsi pintu masuk untuk format ini, yaitu pd.read_csv(), yang mengubah file menjadi DataFrame dalam satu baris kode. Pada Chapter ini kita membuat file CSV kecil, membacanya dengan perilaku default, memeriksa apa yang dilakukan pandas di balik layar, lalu mengatur parameter untuk file yang formatnya tidak standar.
Membaca File CSV Pertama #
Agar contoh bisa dijalankan ulang di mana saja, skrip berikut membuat sendiri file penjualan.csv di folder kerja, lalu membacanya dengan pd.read_csv(). Pada pekerjaan nyata, file tersebut biasanya sudah ada dan kita cukup memanggil pd.read_csv("nama_file.csv").
import pandas as pd
from pathlib import Path
teks_csv = """transaksi,produk,kota,jumlah,harga
1,Kopi Gayo,Bandung,12,85000
2,Teh Melati,Jakarta,30,32000
3,Gula Aren,Surabaya,25,24000
4,Kopi Gayo,Jakarta,,85000
"""
Path("penjualan.csv").write_text(teks_csv, encoding="utf-8")
df = pd.read_csv("penjualan.csv")
print(df)
print()
print(df.dtypes)
print()
print(df.shape)
Path("penjualan.csv").unlink()Output yang Dihasilkan:
transaksi produk kota jumlah harga
0 1 Kopi Gayo Bandung 12.0 85000
1 2 Teh Melati Jakarta 30.0 32000
2 3 Gula Aren Surabaya 25.0 24000
3 4 Kopi Gayo Jakarta NaN 85000
transaksi int64
produk str
kota str
jumlah float64
harga int64
dtype: object
(4, 5)Mari kita telaah baris demi baris:
- Baris 4-10 (
teks_csv = """..."""): isi CSV disimpan sebagai string biasa, satu baris teks mewakili satu baris data, dan kolom dipisahkan tanda koma. - Baris 12 (
Path("penjualan.csv").write_text(...)): string tersebut ditulis menjadi file di folder kerja; langkah ini menggantikan file yang diunduh atau diekspor dari aplikasi lain. - Baris 14 (
df = pd.read_csv("penjualan.csv")):read_csv()menguraikan file menjadi DataFrame dan mengembalikannya sebagai objek baru. - Baris 15-19:
print(df)menampilkan isinya,df.dtypesmenampilkan tipe data setiap kolom, dandf.shapemenampilkan ukuran tabel sebagai(jumlah_baris, jumlah_kolom). - Baris terakhir (
Path("penjualan.csv").unlink()): file contoh dihapus lagi agar folder kerja tetap bersih.
Perilaku Default read_csv() #
read_csv() menjalankan beberapa keputusan otomatis yang penting kita kenali. Baris pertama file dipakai sebagai nama kolom, sehingga transaksi, produk, kota, jumlah, dan harga menjadi nama column tanpa perlu diatur. Setiap baris data diberi label index berupa angka 0 sampai 3 karena kita tidak menentukan kolom label. pandas juga menebak tipe data setiap kolom (type inference): kolom transaksi dan harga menjadi int64, kolom produk dan kota menjadi str, sedangkan kolom jumlah menjadi float64 karena satu selnya kosong.
Sel kosong pada jumlah dibaca sebagai NaN (Not a Number), penanda missing value di pandas. Karena ada satu NaN, seluruh kolom yang tadinya berisi bilangan bulat dinaikkan tipenya menjadi float64. Perhatikan juga kolom teks: di pandas 3.0, read_csv() menghasilkan dtype str, bukan object seperti di pandas 1.x dan 2.x.
Parameter yang Sering Dipakai #
File CSV di dunia nyata tidak semuanya berformat standar. Beberapa file memakai pemisah titik koma, beberapa menyimpan teks khusus untuk sel kosong, dan sebagian besar berukuran besar. read_csv() punya lebih dari lima puluh parameter, tetapi lima parameter berikut sudah menangani sebagian besar kasus:
| Parameter | Kegunaan |
|---|---|
sep | Mengatur pemisah kolom, misalnya sep=";" untuk file hasil ekspor Excel berbahasa Eropa |
usecols | Membaca sebagian kolom saja, misalnya usecols=["produk", "jumlah"] |
nrows | Membaca sejumlah baris pertama saja, praktis untuk mencicipi file besar |
na_values | Menentukan teks mana yang dianggap missing value, misalnya "tidak dijawab" |
parse_dates | Mengubah kolom tertentu menjadi datetime64, misalnya parse_dates=["tanggal"] |
Contoh berikut memakai sep=";" untuk file berpemisah titik koma dan na_values untuk mengubah teks tidak dijawab menjadi NaN:
import pandas as pd
from pathlib import Path
teks_pelanggan = """no;nama;email
1;Budi;[email protected]
2;Siti;[email protected]
3;Dewi;[email protected]
"""
Path("pelanggan.csv").write_text(teks_pelanggan, encoding="utf-8")
pelanggan = pd.read_csv("pelanggan.csv", sep=";")
print(pelanggan)
print()
teks_survei = """responden,usia,pendapatan
1,29,5200000
2,34,tidak dijawab
3,25,tidak dijawab
"""
Path("survei.csv").write_text(teks_survei, encoding="utf-8")
survei = pd.read_csv("survei.csv", na_values=["tidak dijawab"])
print(survei)
print()
print("Rata-rata pendapatan:", survei["pendapatan"].mean())
Path("pelanggan.csv").unlink()
Path("survei.csv").unlink()Output yang Dihasilkan:
no nama email
0 1 Budi [email protected]
1 2 Siti [email protected]
2 3 Dewi [email protected]
responden usia pendapatan
0 1 29 5200000.0
1 2 34 NaN
2 3 25 NaN
Rata-rata pendapatan: 5200000.0Ada dua hal yang layak digarisbawahi dari output di atas. Pertama, tanpa sep=";", read_csv() akan menganggap seluruh baris file pelanggan sebagai satu kolom dengan nama no;nama;email; parameter ini wajib disesuaikan dengan pemisah yang dipakai file. Kedua, na_values=["tidak dijawab"] mengubah teks penanda menjadi NaN, sehingga kolom pendapatan bertipe float64 dan bisa dihitung; panggilan survei["pendapatan"].mean() menghasilkan 5200000.0 karena hanya baris Budi yang punya angka. Tanpa na_values, kolom tersebut akan bertipe str dan perhitungan mean tidak bisa dijalankan.
Dari File Menjadi DataFrame #
Sampai titik ini kita sudah bisa mengubah file CSV menjadi DataFrame lengkap dengan index, nama kolom, dan tipe data yang masuk akal. DataFrame hasil bacaan inilah bahan mentah untuk semua materi berikutnya: pembersihan, agregasi, dan analisis. Karena analisis hampir selalu menghasilkan tabel baru yang perlu disimpan ulang, Chapter berikutnya membahas kebalikan dari read_csv(), yaitu to_csv().