DataLens

Membuat DataFrame dan membaca CSV

Bangun DataFrame dari data Python, muat file CSV dengan read_csv, dan tangani separator, header serta format angka yang muncul di file export sungguhan.

Level: Dasar · 10 menit baca

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

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

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
OpsiFungsinya
sep=";"pemisah antar nilai (default ","). Pakai "\t" untuk file yang dipisah tab.
skiprows=2lewati 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=1000baca 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)
Tips

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

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Berikutnya: Memeriksa data (head, info, describe, dtypes) →