Idenya
Sebagian besar datamu tidak akan diketik ke Python secara manual; data datang dalam bentuk file. Format yang paling umum sejauh ini adalah CSV, dan pandas membacanya dengan satu fungsi: pd.read_csv(). Fungsi itu punya puluhan opsi karena CSV di dunia nyata berantakan: titik koma alih-alih koma, baris judul di atas header, format angka Indonesia seperti 1.250.000, "N/A" di sel kosong.
Modul ini membahas segelintir opsi yang menyelesaikan 95% masalah tersebut, ditambah cara lain membangun DataFrame dari data Python. Proyek ini berisi sales.csv milik Toko Kita (satu baris per produk dalam sebuah order) supaya kamu bisa ikut mencoba.
Membaca CSV
Sistem penjualan toko mengekspor setiap baris pesanan ke file bernama sales.csv. Setiap baris file adalah satu baris data, dengan nilai-nilai yang dipisahkan koma, dan baris pertama berisi nama-nama kolom. Satu panggilan fungsi mengubah seluruh file menjadi DataFrame:
import pandas as pd
sales = pd.read_csv("sales.csv")
print(sales.shape)
print(sales[["order_id", "customer", "product", "revenue"]].head(3))
(71, 12)
order_id customer product revenue
0 1 Kartika Rahma Desk Organizer 89000
1 2 Citra Dewi Arabica Gayo 250g 285000
2 3 Eka Putri Pour-over Kettle 960000
pd.read_csv("sales.csv")membaca file menjadi DataFrame. Baris pertama menjadi nama kolom..shapememberi tahu bahwa ada 71 baris dan 12 kolom.sales[[...]]dengan list nama kolom memilih beberapa kolom (lebih lanjut soal memilih di modul 4), dan.head(3)menampilkan tiga baris pertama.
pandas juga menebak tipe setiap kolom: angka menjadi int64, teks menjadi object. Kamu akan memeriksa dan memperbaiki tipe di modul berikutnya.
Membangun DataFrame dari data Python
Kamu sudah tahu bentuk dictionary berisi list dari modul 1. Ada dua bentuk lagi yang sering sekali muncul.
List berisi dictionary (satu per baris) persis seperti yang diberikan API JSON:
rows = [
{"sku": "P003", "name": "Arabica Gayo 250g", "price": 95000},
{"sku": "P006", "name": "Ceramic Mug", "price": 55000},
{"sku": "P008", "name": "Gel Pen Set"},
]
products = pd.DataFrame(rows)
print(products)
sku name price
0 P003 Arabica Gayo 250g 95000.0
1 P006 Ceramic Mug 55000.0
2 P008 Gel Pen Set NaN
Baris ketiga tidak punya harga, jadi pandas mengisinya dengan NaN ("not a number"), penanda pandas untuk nilai yang hilang. Karena secara teknis NaN adalah float, seluruh kolom menjadi float (95000.0). Kamu akan menangani data yang hilang dengan benar di modul 8.
List berisi list (baris tanpa nama) memerlukan nama kolom yang diberikan terpisah:
orders = pd.DataFrame(
[["NG-001", "Ayu", 285000], ["NG-002", "Budi", 960000]],
columns=["order_id", "customer", "total"],
)
print(orders)
order_id customer total
0 NG-001 Ayu 285000
1 NG-002 Budi 960000
Opsi read_csv yang benar-benar akan kamu pakai
Ini contoh export yang berantakan, seperti yang mungkin kamu dapat dari sistem akuntansi di Indonesia. File ini ada di proyek sebagai export.csv:
Toko Kita - Laporan Penjualan
Diekspor: 05/10/2024
tanggal;produk;jumlah;total
01/07/2024;Kopi Arabica;2;190.000
02/07/2024;Teh Tarik;1;18.000
02/07/2024;Roti Bakar;N/A;45.000
Membacanya tanpa opsi menghasilkan data kacau, karena pandas mengharapkan koma dan header di baris pertama. Opsi-opsi ini memperbaikinya:
export = pd.read_csv(
"export.csv",
sep=";",
skiprows=2,
thousands=".",
na_values=["N/A"],
)
print(export)
print(export.dtypes)
tanggal produk jumlah total
0 01/07/2024 Kopi Arabica 2.0 190000
1 02/07/2024 Teh Tarik 1.0 18000
2 02/07/2024 Roti Bakar NaN 45000
tanggal object
produk object
jumlah float64
total int64
dtype: object
| Opsi | Fungsinya |
|---|---|
sep=";" | pemisah antar nilai (default ","). Pakai "\t" untuk file yang dipisah tab. |
skiprows=2 | lewati baris di bagian atas, misalnya judul di atas header |
thousands="." | anggap . sebagai pemisah ribuan, jadi 190.000 menjadi 190000 |
decimal="," | tanda desimal, untuk angka seperti 4,5 |
na_values=["N/A", "-"] | teks tambahan yang dianggap sebagai nilai hilang |
usecols=[...] | baca hanya sebagian kolom (lebih cepat, lebih hemat memori) |
nrows=1000 | baca hanya baris-baris pertama, praktis untuk mengintip file besar |
header=None, names=[...] | file tidak punya baris header, jadi berikan namanya sendiri |
index_col="order_id" | pakai sebuah kolom sebagai label baris |
encoding="latin-1" | untuk file yang bukan UTF-8 (saat kamu melihat karakter aneh) |
Sebelum membaca file yang belum kamu kenal, lihat beberapa baris pertamanya sebagai teks biasa. Di situs ini, print(open("export.csv").read()[:300]) menampilkannya. Dua detik melihat menghemat dua puluh menit menebak-nebak opsi.
Memilih kolom dan index saat membaca
Ekspor sungguhan sering punya kolom jauh lebih banyak dari yang kamu butuhkan, dan kadang jutaan baris. Kamu tidak harus memuat semuanya lalu membuang sebagian besar sesudahnya. read_csv bisa memilih kolom yang kamu mau, memakai salah satunya sebagai index, dan berhenti setelah beberapa baris, yang praktis untuk mengintip file yang sangat besar:
small = pd.read_csv("sales.csv", usecols=["order_id", "product", "revenue"], index_col="order_id", nrows=4)
print(small)
product revenue
order_id
1 Desk Organizer 89000
2 Arabica Gayo 250g 285000
3 Pour-over Kettle 960000
4 Scented Candle 75000
index_col mengganti label 0, 1, 2… dengan ID order. Perhatikan bahwa index bisa berulang: order dengan dua produk akan punya dua baris berlabel order_id yang sama. Index tidak harus unik, dan ini sering mengejutkan orang yang terbiasa dengan database.
Membaca dari teks dan URL
read_csv menerima lebih dari sekadar path file. URL bisa dipakai di komputermu sendiri (pd.read_csv("https://.../data.csv")), dan untuk teks yang sudah ada di memori, bungkus dengan io.StringIO, yang membuat string berperilaku seperti file:
import io
text = "city,orders\nJakarta,18\nBandung,6\n"
cities = pd.read_csv(io.StringIO(text))
print(cities)
city orders
0 Jakarta 18
1 Bandung 6
Mengapa ini penting untuk kode yang bersih
Letakkan semua pengetahuan tentang keanehan sebuah file dalam satu pemanggilan read_csv, tepat di tempat data masuk ke programmu, dan beri hasilnya nama yang bermakna. Dengan begitu semua langkah sesudahnya bekerja dengan kolom yang bersih dan angka yang benar. Menyebar perbaikan (mengganti titik di sini, melewati baris di sana) ke seluruh analisismu membuatnya rapuh dan sulit dijalankan ulang bulan depan. Satu langkah pemuatan yang terdokumentasi dengan baik adalah fondasi analisis yang bisa direproduksi.
Rangkuman
pd.read_csv(path)memuat CSV;.shapedan.head()memberi gambaran pertama.pd.DataFrame(list_of_dicts)membangun satu baris per dict; key yang hilang menjadiNaN.pd.DataFrame(list_of_lists, columns=[...])memerlukan nama kolom.- Opsi penting:
sep,skiprows,thousands,decimal,na_values,usecols,nrows,header/names,index_col,encoding. io.StringIO(text)memungkinkanmu membaca teks CSV dari sebuah string.- Lihat file mentahnya dulu; tangani keanehannya dalam satu langkah pemuatan.