Hasil analisis baru berguna bila dapat disimpan dan dibaca ulang tanpa kejutan, sehingga keputusan saat menulis berkas sama pentingnya dengan keputusan saat membacanya. Topik ini membahas to_csv beserta keputusan menyertakan atau membuang index, pengaturan sep dan encoding, serta to_parquet sebagai format kerja yang menyimpan index dan tipe data secara utuh. Contohnya tetap memakai log sensor singkat dari tiga ruangan, dan setiap keputusan ditunjukkan lewat hasil pembacaan ulang berkasnya.
Keputusan index saat menulis CSV#
Parameter index menentukan apakah index DataFrame ikut ditulis sebagai kolom, dan keputusan yang lalai meninggalkan kolom tak dikenal ketika berkas dibaca ulang. Blok berikut menulis CSV dengan perilaku bawaannya, yaitu index ikut ditulis.
import pandas as pd
log = pd.DataFrame({
"waktu": pd.date_range("2026-01-05 07:00", periods=4, freq="15min"),
"ruang": ["Lab A", "Lab B", "Ruang Arsip", "Lab A"],
"suhu_c": [23.4, 24.1, 22.8, 24.6],
})
log.to_csv("log_default.csv")
df = pd.read_csv("log_default.csv")
print(df.columns.tolist())
print(df.head(2))['Unnamed: 0', 'waktu', 'ruang', 'suhu_c']
Unnamed: 0 waktu ruang suhu_c
0 0 2026-01-05 07:00:00 Lab A 23.4
1 1 2026-01-05 07:15:00 Lab B 24.1Nilai bawaan to_csv menulis index 0 sampai 3 di depan data tanpa memberinya nama. Saat dibaca ulang, kolom itu muncul dengan nama Unnamed: 0 dan isinya sekadar nomor baris yang tidak membawa informasi. Kolom semacam ini mengotori tabel, memicu kebingungan pada pembaca berkas, dan harus dibuang lagi bila lolos ke tahap berikutnya.
import pandas as pd
log = pd.DataFrame({
"waktu": pd.date_range("2026-01-05 07:00", periods=4, freq="15min"),
"ruang": ["Lab A", "Lab B", "Ruang Arsip", "Lab A"],
"suhu_c": [23.4, 24.1, 22.8, 24.6],
})
log.to_csv("log_bersih.csv", index=False)
df = pd.read_csv("log_bersih.csv")
print(df.columns.tolist())
print(df.head(2))['waktu', 'ruang', 'suhu_c']
waktu ruang suhu_c
0 2026-01-05 07:00:00 Lab A 23.4
1 2026-01-05 07:15:00 Lab B 24.1Dengan index=False, berkas hanya memuat kolom data dan pembacaan ulangnya bersih. Index yang memuat nomor urut bawaan memang tidak perlu ditulis. Aturan praktisnya berbalik ketika index memuat informasi nyata, misalnya waktu yang dijadikan index, karena nilai itu hilang bila tidak ikut ditulis. Dalam kasus itu tulis indexnya dengan nama yang jelas melalui index_label, atau kembalikan kolomnya menjadi index saat membaca melalui set_index.
Kebalikannya juga perlu dikenali, yaitu berkas pihak lain yang datang dengan kolom Unnamed: 0 di dalamnya. Kolom itu menandakan penulis berkas membiarkan index ikut tertulis, sehingga pembacaannya dapat mengabaikan kolom tersebut lewat usecols atau membuangnya dengan drop setelah dibaca. Nomor baris semacam itu jarang berguna karena sekadar menyalin urutan baris bawaan penulisnya, dan kehadirannya membuat daftar kolom berkas tampak lebih panjang dari data yang sesungguhnya.
Pemisah dan encoding#
Parameter sep dan encoding mengatur cara nilai dipisahkan serta cara karakter disimpan, dan keduanya harus disamakan pada saat berkas dibaca ulang. Blok berikut menulis log dengan pemisah titik koma karena salah satu catatannya mengandung koma.
from pathlib import Path
import pandas as pd
log = pd.DataFrame({
"waktu": pd.date_range("2026-01-05 07:00", periods=4, freq="15min"),
"ruang": ["Lab A", "Lab B", "Ruang Arsip", "Lab A"],
"suhu_c": [23.4, 24.1, 22.8, 24.6],
"catatan": ["normal", "koreksi ±0,5 °C", "normal", "normal"],
})
log.to_csv("log_titik_koma.csv", sep=";", index=False, encoding="utf-8-sig")
print(Path("log_titik_koma.csv").read_text(encoding="utf-8-sig"), end="")
df = pd.read_csv("log_titik_koma.csv", sep=";", encoding="utf-8-sig")
print(df)waktu;ruang;suhu_c;catatan
2026-01-05 07:00:00;Lab A;23.4;normal
2026-01-05 07:15:00;Lab B;24.1;koreksi ±0,5 °C
2026-01-05 07:30:00;Ruang Arsip;22.8;normal
2026-01-05 07:45:00;Lab A;24.6;normal
waktu ruang suhu_c catatan
0 2026-01-05 07:00:00 Lab A 23.4 normal
1 2026-01-05 07:15:00 Lab B 24.1 koreksi ±0,5 °C
2 2026-01-05 07:30:00 Ruang Arsip 22.8 normal
3 2026-01-05 07:45:00 Lab A 24.6 normalPemisah titik koma menjaga nilai koreksi ±0,5 °C tetap satu kolom meskipun mengandung koma, dan teks mentah pada keluaran menunjukkan batas kolomnya tetap rapi. Nilai bawaan encoding adalah utf-8, sedangkan utf-8-sig menambahkan penanda BOM di awal berkas agar aplikasi seperti Excel mengenali penyandian UTF-8 dengan benar. pandas sendiri membersihkan BOM itu saat membaca, tetapi sebagian aplikasi lain justru memerlukannya, sehingga pilihannya menyesuaikan pihak yang menerima berkas. Yang tidak boleh berubah adalah pasangan tulis dan baca, yaitu berkas yang ditulis dengan sep dan encoding tertentu dibaca kembali dengan pengaturan yang sama.
Pemilihan pemisah biasanya lahir dari isi data, bukan dari selera. Nilai yang mengandung koma, misalnya catatan bebas atau angka bergaya Eropa, lebih aman ditulis dengan pemisah lain sehingga tidak perlu dibungkus tanda kutip. Adapun encoding menjadi masalah ketika berkas berpindah sistem, karena berkas warisan Windows lama kadang tersimpan dalam penyandian lain dan terbaca kacau bila dipaksa UTF-8. Bila ragu, baca beberapa baris pertama berkasnya sebagai teks mentah terlebih dahulu, lalu tetapkan encoding yang sesuai sebelum pembacaan penuh dilakukan.
Parquet sebagai format kerja#
Format Parquet menyimpan index dan tipe data bersama isinya, sehingga hasil to_parquet dapat dibaca ulang persis seperti aslinya tanpa pengaturan apa pun. Blok berikut mengulang penulisan log sensor yang sama dalam format ini.
import pandas as pd
log = pd.DataFrame({
"waktu": pd.date_range("2026-01-05 07:00", periods=4, freq="15min"),
"ruang": ["Lab A", "Lab B", "Ruang Arsip", "Lab A"],
"suhu_c": [23.4, 24.1, 22.8, 24.6],
})
log.to_parquet("log_kerja.parquet")
df = pd.read_parquet("log_kerja.parquet")
print(df.columns.tolist())
print(df.equals(log))
print(df.dtypes)['waktu', 'ruang', 'suhu_c']
True
waktu datetime64[us]
ruang str
suhu_c float64
dtype: objectTidak ada kolom Unnamed: 0 karena index ikut tersimpan di dalam berkas tanpa menjadi kolom, dan equals mengembalikan True yang berarti tabel kembali utuh. Kolom waktu tetap datetime64[us] tanpa parse_dates, karena tipenya ikut tersimpan bersama datanya. Karakter inilah yang menempatkan Parquet sebagai format kerja antartahap, sedangkan CSV tetap menjadi format pertukaran dan Excel menjadi format laporan seperti dibahas pada topik Berkas Excel.
Ukuran berkas menjadi alasan tambahan, karena kompresi bawaan membuat Parquet jauh lebih ramping pada data numerik besar sebagaimana diukur pada topik Basis Data dan Parquet. Kelemahannya terletak pada keterbacaan manusia, karena isinya biner dan tidak dapat diperiksa dengan editor teks, ditambah kebutuhan mesin baca seperti pyarrow pada sisi penerima. Bila keluaran harus dapat dibuka tanpa Python, CSV atau Excel tetap menjadi pilihan yang lebih tepat meskipun tipenya tidak seutuh Parquet.
Kesalahan umum#
- Kolom
Unnamed: 0muncul saat berkas dibaca ulang. Penyebabnya adalahto_csvyang menulis index bawaan tanpaindex=False. Perbaikannya dengan menulis ulang tanpa index, atau membuang kolom tersebut saat membaca bila berkasnya berasal dari pihak lain. - Pembacaan menghasilkan satu kolom padahal berkasnya berisi banyak kolom. Penyebabnya adalah
sepyang berbeda antara penulisan dan pembacaan, misalnya berkas ditulis dengan titik koma lalu dibaca dengan nilai bawaan. Samakansepdi kedua sisi dan periksadf.columnssetelah membaca. - Berkas keluaran lama hilang tanpa peringatan. Penyebabnya adalah
to_csvyang menimpa berkas dengan nama sama secara langsung. Beri nama berkas yang memuat tanggal atau nomor versi, atau periksa keberadaan berkas terlebih dahulu sebelum menulis.
Ringkasan#
to_csvmenulis index sebagai kolom secara bawaan, sehinggaindex=Falsediperlukan untuk CSV yang hanya memuat kolom data.- Index yang memuat informasi nyata tetap ditulis, dan namanya diatur melalui
index_label. sepdanencodingpada penulisan harus disamakan pada pembacaan, denganutf-8-siguntuk kompatibilitas Excel.to_parquetmenyimpan index dan dtype bersama datanya sehingga pembacaan ulang menghasilkan tabel yang identik.
Referensi#
- pandas.DataFrame.to_csv — pandas documentation
— Parameter
to_csv, termasukindex,sep,encoding, danindex_label. - pandas.DataFrame.to_parquet — pandas documentation
— Parameter
to_parquetbeserta pilihan kompresi format kerja ini. - IO tools (text, CSV, HDF5, …) — pandas documentation — Panduan resmi baca tulis data yang mencakup CSV dan Parquet.