CSV dan Excel sudah kita kuasai pada Section Membaca dan Menulis Data, tetapi alur kerja modern memuat format lain yang sering lebih tepat: pyarrow.Table sebagai mata uang data antar library, Parquet dan Feather untuk penyimpanan kolom yang cepat, dictionary Python untuk kode aplikasi, JSON untuk pertukaran lintas bahasa, dan pickle untuk snapshot persis satu sesi. Pada Chapter penutup Section ini kita berlatih bertukar data dengan semuanya dari satu DataFrame yang sama, lalu menutup dengan peta kapan tiap format dipilih.

pyarrow.Table dan Format Kolom #

Apache Arrow mendefinisikan tata letak memori kolom yang menjadi bahasa bersama ekosistem data — Polars, DuckDB, Spark, dan pandas sendiri memahaminya. Konversi dua arah antara DataFrame dan pyarrow.Table tidak menyalin berkas apa pun, hanya menunjuk memori yang sama:

python
import os
import tempfile

import pandas as pd
import pyarrow as pa

penjualan = pd.DataFrame({
    "produk": ["Beras", "Minyak", "Gula"],
    "jumlah": [40, 25, 30],
    "harga": [68000.0, 35000.0, 18000.0],
})

# 1. DataFrame menjadi pyarrow.Table
tabel = pa.Table.from_pandas(penjualan, preserve_index=False)
print("kolom tabel :", tabel.column_names)
print("jumlah baris:", tabel.num_rows)
kembali = tabel.to_pandas()
print("roundtrip pyarrow sama:", kembali.equals(penjualan))
print()

with tempfile.TemporaryDirectory() as folder:
    # 2. Parquet: format kolom terkompresi
    path_parquet = os.path.join(folder, "penjualan.parquet")
    penjualan.to_parquet(path_parquet)
    hasil = pd.read_parquet(path_parquet)
    print("parquet sama        :", hasil.equals(penjualan))
    print("dtype harga parquet :", hasil["harga"].dtype)
    print()

    # 3. Feather: format kolom ringan untuk pertukaran cepat
    path_feather = os.path.join(folder, "penjualan.feather")
    penjualan.to_feather(path_feather)
    hasil2 = pd.read_feather(path_feather)
    print("feather sama        :", hasil2.equals(penjualan))
    print("dtype harga feather :", hasil2["harga"].dtype)

print("berkas sementara terhapus bersama folder temp")

Output yang Dihasilkan:

text
kolom tabel : ['produk', 'jumlah', 'harga']
jumlah baris: 3
roundtrip pyarrow sama: True

parquet sama        : True
dtype harga parquet : float64

feather sama        : True
dtype harga feather : float64
berkas sementara terhapus bersama folder temp

Mari kita telaah baris-baris pentingnya:

  1. Baris 10 (harga berisi 68000.0): kolom harga sengaja bertipe float64 agar perilaku format terlihat — ingat selalu cek dtype setelah pertukaran.
  2. Baris 14-18 (pa.Table.from_pandas(...), to_pandas()): DataFrame menjadi pyarrow.Table dengan tiga kolom dan tiga baris; preserve_index=False menyatakan index 0-2 tidak ikut disimpan, dan perjalanan pulang menghasilkan DataFrame yang equals dengan aslinya.
  3. Baris 23-27 (Parquet): to_parquet() menulis berkas kolom terkompresi, read_parquet() membacanya kembali; hasil equals: True dan dtype harga tetap float64 — schema tersimpan bersama datanya.
  4. Baris 31-35 (Feather): to_feather() dan read_feather() memakai format Arrow yang lebih ringan tanpa kompresi berat, cocok untuk pertukaran sementara berkecepatan tinggi antar proses.
  5. Baris terakhir: kedua berkas dibuat di dalam folder sementara (TemporaryDirectory) sehingga tidak menyisakan artefak.

Parquet dan Feather sama-sama kolom dan sama-sama mempertahankan dtype; bedanya Parquet mengutamakan kompresi untuk penyimpanan jangka panjang, Feather mengutamakan kecepatan baca-tulis sementara.

Dictionary, JSON, Pickle, dan Markdown #

Sementara itu, format dalam memori dan teks biasa tetap sering dibutuhkan — untuk mengumpani kode Python lain, menyimpan hasil sementara, atau menyisipkan tabel ke dokumentasi:

python
import io
import os
import tempfile

import pandas as pd

penjualan = pd.DataFrame({
    "produk": ["Beras", "Minyak", "Gula"],
    "jumlah": [40, 25, 30],
    "harga": [68000.0, 35000.0, 18000.0],
})

# 1. Dictionary Python: to_dict() dan from_dict()
kamus = penjualan.to_dict(orient="records")
print("to_dict records [0]:", kamus[0])
nilai = pd.DataFrame.from_dict({"nama": ["Budi", "Siti"], "nilai": [88, 91]})
print(nilai)
print()

# 2. JSON: orient="records" dan pembacaan kembali
json_records = penjualan.to_json(orient="records")
print("json:", json_records)
hasil = pd.read_json(io.StringIO(json_records))
print("dtype harga setelah JSON:", hasil["harga"].dtype)
print()

# 3. Pickle: snapshot objek Python persis
with tempfile.TemporaryDirectory() as folder:
    path = os.path.join(folder, "penjualan.pkl")
    penjualan.to_pickle(path)
    kembali = pd.read_pickle(path)
    print("pickle sama:", kembali.equals(penjualan))
print()

# 4. Markdown untuk dokumentasi dan laporan
print(penjualan.to_markdown(index=False))

Output yang Dihasilkan:

text
to_dict records [0]: {'produk': 'Beras', 'jumlah': 40, 'harga': 68000.0}
   nama  nilai
0  Budi     88
1  Siti     91

json: [{"produk":"Beras","jumlah":40,"harga":68000.0},{"produk":"Minyak","jumlah":25,"harga":35000.0},{"produk":"Gula","jumlah":30,"harga":18000.0}]
dtype harga setelah JSON: int64

pickle sama: True

| produk   |   jumlah |   harga |
|:---------|---------:|--------:|
| Beras    |       40 |   68000 |
| Minyak   |       25 |   35000 |
| Gula     |       30 |   18000 |

Mari kita telaah baris-baris pentingnya:

  1. Baris 14-15 (to_dict(orient="records")): DataFrame menjadi list of dictionary — bentuk bawaan banyak API Python; kebalikannya from_dict() dan from_records() menampung bentuk itu kembali menjadi tabel.
  2. Baris 21-24 (JSON): to_json(orient="records") menghasilkan teks JSON satu baris per objek, dan read_json() membacanya lewat io.StringIO karena pandas 3.0 menuntut pembungkus itu untuk teks, bukan string mentah.
  3. Baris 24 (dtype harga setelah JSON: int64): ini gotcha penting — JSON tidak menyimpan tipe data, sehingga harga yang aslinya float64 kembali sebagai int64 karena nilai-nilainya berupa bilangan bulat. Format schema-first seperti Parquet tidak mengalami masalah ini.
  4. Baris 28-32 (pickle): to_pickle() menyimpan objek Python apa adanya dan read_pickle() mengembalikannya persis; hasil equals: True menandakan isi pulih sempurna.
  5. Baris 36 (to_markdown(index=False)): DataFrame dirender menjadi tabel Markdown yang siap ditempel ke README atau laporan — rapi tanpa dependensi berkas.

Peta Memilih Format Pertukaran #

FormatFungsi kunciPilih ketika
CSV / Excelread_csv, to_csv, read_exceldata ditukar dengan manusia atau alat spreadsheet
Parquet / Featherto_parquet, read_parquet, to_featherdataset besar, dtype harus utuh, dipakai library kolom
pyarrow.Tablepa.Table.from_pandas, to_pandasmengalirkan data antar library ekosistem Arrow
Dictionary / JSONto_dict, to_json, read_jsonintegrasi dengan kode Python dan API web
Pickleto_pickle, read_picklesnapshot cepat antar sesi milik sendiri
Database SQLto_sql, read_sqldata hidup di server relasional (Chapter SQLAlchemy)

Dengan ini seluruh lalui masuk-keluar data pandas sudah kita lewati: fondasi NumPy, visual Matplotlib dan seaborn, statistik scipy, model scikit-learn, database SQLAlchemy, notebook Jupyter, konversi array, dan kini format-format pertukaran. Pemahaman ekosistem ini menjadi pijakan untuk pertanyaan yang selalu muncul di pekerjaan nyata: mana operasi yang murah dan mana yang mahal. Section berikutnya, Performa dan Efisiensi, membahasnya mulai dari Chapter Memahami Biaya Operasi DataFrame — mengukur dulu, baru mengoptimalkan.

Daftar format ini terus bertambah: sejak pandas 3.0, tabel Apache Iceberg ikut didukung lewat read_iceberg() dan DataFrame.to_iceberg() untuk membaca serta menulis tabel lakehouse.

Referensi resmi untuk pendalaman: pandas.read_parquet , pandas.DataFrame.to_parquet , dan pandas.read_feather .