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").

python
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:

text
   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:

  1. Baris 4-10 (teks_csv = """..."""): isi CSV disimpan sebagai string biasa, satu baris teks mewakili satu baris data, dan kolom dipisahkan tanda koma.
  2. 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.
  3. Baris 14 (df = pd.read_csv("penjualan.csv")): read_csv() menguraikan file menjadi DataFrame dan mengembalikannya sebagai objek baru.
  4. Baris 15-19: print(df) menampilkan isinya, df.dtypes menampilkan tipe data setiap kolom, dan df.shape menampilkan ukuran tabel sebagai (jumlah_baris, jumlah_kolom).
  5. 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:

ParameterKegunaan
sepMengatur pemisah kolom, misalnya sep=";" untuk file hasil ekspor Excel berbahasa Eropa
usecolsMembaca sebagian kolom saja, misalnya usecols=["produk", "jumlah"]
nrowsMembaca sejumlah baris pertama saja, praktis untuk mencicipi file besar
na_valuesMenentukan teks mana yang dianggap missing value, misalnya "tidak dijawab"
parse_datesMengubah 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:

python
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:

text
   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.0

Ada 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().