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.
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:
,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
TrueMari kita bedah hasilnya:
- Baris 3-7 (
stok = pd.DataFrame({...})): DataFrame contoh dibangun dari dictionary dengan tiga kolom, persis seperti yang kita pelajari pada Section Dasar DataFrame. - Baris 9-10 (
stok.to_csv("stok_default.csv")): tanpa parameter tambahan, pandas menulis kolomindexsebagai kolom pertama. Isi file yang dicetak menunjukkan baris pertama berupa,produk,harga,stok; tanda koma di depan adalah kolom index tanpa nama, lalu baris0,Kopi Gayo,...memuat nilai index. - Baris 12-13 (
stok.to_csv("stok_rapi.csv", index=False)): denganindex=False, pandas tidak menulis kolom index. File hasilnya bersih: satu baris header dan tiga baris data. - Baris 15-16 (
pd.read_csv(...).equals(stok)): file rapi dibaca ulang dan dibandingkan dengan DataFrame asalnya; hasilTruemenunjukkan 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:
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:
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: objectTiga parameter di atas bekerja sebagai berikut:
sep=";": pemisah kolom diganti dari koma menjadi titik koma; aplikasi penerima yang memang menuntut format ini bisa membaca file tanpa pengaturan tambahan.na_rep="kosong": nilaiNaNpada kolomjumlahditulis sebagai tekskosong, bukan sel hampa. Tanpana_rep, pandas menulisNaNsebagai sel kosong (dua pemisah berurutan).float_format="%.0f": semua kolomfloatdiformat tanpa angka di belakang koma, sehingga1020000.0ditulis sebagai1020000.
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 encoding | Kapan 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().