Hasil analisis yang masih berupa DataFrame di memori hanya hidup selama skrip Python berjalan; begitu sesi berakhir, hasilnya tidak tersimpan di mana pun. Method to_csv() menyelesaikan masalah ini dengan mengekspor DataFrame menjadi file CSV yang bisa dibuka lagi besok, dikirim lewat email, atau dimuat ke aplikasi lain seperti Excel dan database. Pada Chapter ini kita mengekspor DataFrame pertama, menghilangkan kolom index yang ikut terbawa secara default, lalu mengatur pemisah, penanda sel kosong, dan encoding file.

Ekspor Pertama dengan to_csv() #

Skrip berikut mengekspor DataFrame stok barang dua kali: sekali dengan perilaku default dan sekali dengan index=False, agar perbedaannya terlihat jelas. Setiap kali menulis, isi file langsung dibaca ulang dan dicetak ke layar.

python
import pandas as pd
from pathlib import Path

stok = pd.DataFrame({
    "produk": ["Kopi Gayo", "Teh Melati", "Gula Aren"],
    "harga": [85000, 32000, 24000],
    "stok": [12, 30, 25],
})

stok.to_csv("stok_default.csv")
print(Path("stok_default.csv").read_text(encoding="utf-8"))

stok.to_csv("stok_rapi.csv", index=False)
print(Path("stok_rapi.csv").read_text(encoding="utf-8"))

kembali = pd.read_csv("stok_rapi.csv")
print(kembali.equals(stok))

Path("stok_default.csv").unlink()
Path("stok_rapi.csv").unlink()

Output yang Dihasilkan:

text
,produk,harga,stok
0,Kopi Gayo,85000,12
1,Teh Melati,32000,30
2,Gula Aren,24000,25

produk,harga,stok
Kopi Gayo,85000,12
Teh Melati,32000,30
Gula Aren,24000,25

True

Mari kita bedah hasilnya:

  1. Baris 3-7 (stok = pd.DataFrame({...})): DataFrame contoh dibangun dari dictionary dengan tiga kolom, persis seperti yang kita pelajari pada Section Dasar DataFrame.
  2. Baris 9-10 (stok.to_csv("stok_default.csv")): tanpa parameter tambahan, pandas menulis kolom index sebagai kolom pertama. Isi file yang dicetak menunjukkan baris pertama berupa ,produk,harga,stok; tanda koma di depan adalah kolom index tanpa nama, lalu baris 0,Kopi Gayo,... memuat nilai index.
  3. Baris 12-13 (stok.to_csv("stok_rapi.csv", index=False)): dengan index=False, pandas tidak menulis kolom index. File hasilnya bersih: satu baris header dan tiga baris data.
  4. Baris 15-16 (pd.read_csv(...).equals(stok)): file rapi dibaca ulang dan dibandingkan dengan DataFrame asalnya; hasil True menunjukkan proses simpan-baca mengembalikan data yang sama persis.

Mengatur Pemisah, Sel Kosong, dan Format Angka #

Parameter sep, na_rep, dan float_format mengatur tiga hal yang sering dituntut penerima file: pemisah kolom, cara menulis missing value, dan bentuk angka desimal. Contoh berikut menyusun laporan penjualan untuk aplikasi yang meminta pemisah titik koma dan tidak menerima sel kosong:

python
import pandas as pd
from pathlib import Path

penjualan = pd.DataFrame({
    "produk": ["Kopi Gayo", "Teh Melati", "Kopi Gayo"],
    "jumlah": [12.0, 30.0, None],
    "nilai": [1020000.0, 960000.0, 680000.0],
})

penjualan.to_csv("laporan.csv", sep=";", index=False, na_rep="kosong", float_format="%.0f")
print(Path("laporan.csv").read_text(encoding="utf-8"))

kembali = pd.read_csv("laporan.csv", sep=";", na_values=["kosong"])
print(kembali)
print()
print(kembali.dtypes)

Path("laporan.csv").unlink()

Output yang Dihasilkan:

text
produk;jumlah;nilai
Kopi Gayo;12;1020000
Teh Melati;30;960000
Kopi Gayo;kosong;680000

       produk  jumlah    nilai
0   Kopi Gayo    12.0  1020000
1  Teh Melati    30.0   960000
2   Kopi Gayo     NaN   680000

produk        str
jumlah    float64
nilai       int64
dtype: object

Tiga parameter di atas bekerja sebagai berikut:

  1. sep=";": pemisah kolom diganti dari koma menjadi titik koma; aplikasi penerima yang memang menuntut format ini bisa membaca file tanpa pengaturan tambahan.
  2. na_rep="kosong": nilai NaN pada kolom jumlah ditulis sebagai teks kosong, bukan sel hampa. Tanpa na_rep, pandas menulis NaN sebagai sel kosong (dua pemisah berurutan).
  3. float_format="%.0f": semua kolom float diformat tanpa angka di belakang koma, sehingga 1020000.0 ditulis sebagai 1020000.

Perhatikan bagian akhir output: file dibaca ulang dengan sep=";" dan na_values=["kosong"], lalu pandas menebak ulang tipe data setiap kolom. Kolom jumlah kembali menjadi float64 karena mengandung NaN, sedangkan kolom nilai yang tertulis tanpa desimal terbaca sebagai int64, padahal DataFrame asalnya float64. Inilah sifat mendasar CSV: formatnya adalah teks biasa tanpa metadata tipe, sehingga tipe data ditentukan ulang saat membaca. Untuk menyimpan tipe data secara utuh, kita perlu format biner seperti Parquet yang dibahas pada Chapter berikutnya. Seluruh parameter ekspor juga dirangkum pada halaman IO tools .

Mengatur Encoding File #

Parameter encoding menentukan bagaimana karakter disimpan sebagai byte. Pilihan yang tepat mencegah karakter Indonesia seperti é atau simbol mata uang berubah menjadi deretan tanda aneh saat dibuka di aplikasi lain:

Nilai encodingKapan dipakai
"utf-8"Default pandas; universal dan aman untuk hampir semua keperluan modern
"utf-8-sig"Sama dengan UTF-8 tetapi menambahkan penanda tiga byte di awal file, agar Excel Windows mengenali karakter non-ASCII dengan benar
"latin-1"File lama dari sistem Eropa yang belum memakai UTF-8

Pada praktiknya, encoding="utf-8" cukup untuk skrip internal, sedangkan encoding="utf-8-sig" menjadi pilihan aman ketika file CSV akan dibuka langsung oleh pengguna Excel di Windows. Jika file sumber dari sistem lama tampil sebagai karakter yang salah saat dibaca, coba baca ulang dengan encoding="latin-1". Daftar parameter ekspor lainnya, termasuk columns untuk memilih kolom tertentu dan lineterminator untuk mengatur akhir baris, dijelaskan pada dokumentasi to_csv .

Dari DataFrame ke File yang Dibagikan #

Kita sekarang menguasai dua arah lalu lintas data CSV: read_csv() untuk masuk dan to_csv() untuk keluar, lengkap dengan kendali atas index, pemisah, missing value, dan encoding. Format CSV memang sederhana dan serbaguna, tetapi tidak menyimpan tipe data dan tidak bisa menampung beberapa tabel dalam satu file. Chapter berikutnya membahas format Excel yang menyelesaikan kedua keterbatasan itu dengan read_excel() dan to_excel().