Pembuatan DataFrame

Membuat DataFrame dari dict, list, array NumPy, dan daftar record.

Daftar isi

DataFrame dapat dibangun dari banyak bentuk data Python, dan bentuk sumbernya menentukan index serta tipe awal tabel yang terbentuk. Topik ini membahas pembuatan DataFrame dari dictionary berisi list, dictionary berisi Series, daftar record, dan array NumPy, beserta penentuan index eksplisit sejak awal. Setelah membacanya, data yang tersimpan dalam bentuk berbeda dapat diubah menjadi tabel dengan kerangka kolom dan baris yang tepat.

Dari dictionary berisi list dan berisi Series#

Bentuk pembuatan yang paling umum adalah dictionary yang kuncinya menjadi nama kolom dan nilainya berupa list atau Series dengan panjang yang sama. Bentuk ini muncul hampir di semua kode pandas karena paling dekat dengan cara data diketik manual. Kode berikut membangun tabel pencatatan suhu dua kali dengan kedua variasi tersebut.

python Contoh: DataFrame dari dictionary
import pandas as pd

df = pd.DataFrame(
    {
        "waktu": ["07:00", "07:15", "07:30"],
        "suhu_c": [24.1, 23.8, 25.0],
    }
)
print(df)

suhu = pd.Series(
    [24.1, 23.8, 25.0],
    index=["07:00", "07:15", "07:30"],
    name="suhu_c",
)
df2 = pd.DataFrame({"suhu_c": suhu})
print(df2)
text Keluaran
   waktu  suhu_c
0  07:00    24.1
1  07:15    23.8
2  07:30    25.0
       suhu_c
07:00    24.1
07:15    23.8
07:30    25.0

Pada keluaran pertama, kunci waktu dan suhu_c menjadi nama kolom, sedangkan index barisnya adalah RangeIndex 0 sampai 2 karena list tidak membawa label. Pada keluaran kedua, index Series yang berlabel waktu-string dipertahankan menjadi index baris, sehingga tabel langsung berlabel bermakna tanpa argumen tambahan. Atribut name dari Series tidak dipakai sebagai nama kolom karena nama kolom diambil dari kunci dictionarynya. Bila beberapa Series dijadikan nilai dictionary, masing-masing indexnya akan diselaraskan, dan label yang tidak bertemu menghasilkan NaN.

Bentuk dictionary menetapkan dua hal sekaligus, yaitu urutan kolom mengikuti urutan kunci dan tipe awal setiap kolom mengikuti isi nilainya. Dictionary yang menulis kunci lembap_pct lebih dahulu menghasilkan kolom lembap_pct di sisi kiri tabel, sehingga susunan kolom sepenuhnya ditentukan penulisnya. Aturan satu kolom satu tipe juga berlaku sejak pembuatan, dan satu list yang mencampur bilangan dengan teks menghasilkan kolom bertipe object, misalnya {"x": [1, "a"]} yang dtypenya object. Perilaku itu menandai kolom yang perlu dipisahkan atau dikonversi, dan kenaikan dtype lanjutannya dibahas pada topik Anatomi DataFrame.

Dari daftar record dan dari array NumPy#

Data berbentuk catatan per baris dibangun dari list of dictionary yang disebut juga record, sedangkan data numerik murni dibangun dari array NumPy dengan nama kolom lewat argumen columns. Kedua bentuk ini lazim ditemui saat data berasal dari berkas JSON atau dari perhitungan matriks.

python Contoh: daftar record dan array NumPy
import pandas as pd
import numpy as np

df = pd.DataFrame(
    [
        {"ruang": "Lab A", "suhu_c": 24.1},
        {"ruang": "Lab B", "suhu_c": 23.8},
    ]
)
print(df)

arr = np.array([[24.1, 60.2], [23.8, 58.7]])
df2 = pd.DataFrame(arr, columns=["suhu_c", "lembap_pct"], index=["Lab A", "Lab B"])
print(df2)
print(df2.dtypes)
text Keluaran
   ruang  suhu_c
0  Lab A    24.1
1  Lab B    23.8
       suhu_c  lembap_pct
Lab A    24.1        60.2
Lab B    23.8        58.7
suhu_c        float64
lembap_pct    float64
dtype: object

Setiap dictionary pada list menjadi satu baris, dan kuncinya menjadi nama kolom yang dikumpulkan dari seluruh record. Bila sebuah record tidak memuat kunci yang dimuat record lain, kolom tersebut tetap terbentuk dan baris yang bersangkutan diisi NaN. Pembuatan dari array mengikuti posisi, yaitu baris pertama array menjadi baris pertama tabel, dan argumen columns memberi nama pada setiap kolomnya. Keluaran dtypes menunjukkan kedua kolom float64 karena array sumbernya bertipe float, sedangkan array bertipe int menghasilkan kolom int64.

Menentukan index secara eksplisit#

Argumen index diterima konstruktor DataFrame untuk memberi label baris yang bermakna sejak tabel pertama kali dibentuk. Label yang baik memudahkan akses lewat loc dan menjaga baris tetap teridentifikasi setelah pengurutan. Contoh berikut memberi label ruangan pada tabel pengukuran dua kolom.

python Contoh: index eksplisit saat pembuatan
import pandas as pd

df = pd.DataFrame(
    {
        "suhu_c": [24.1, 23.8, 25.0],
        "lembap_pct": [60.2, 58.7, 61.0],
    },
    index=["Lab A", "Lab B", "Arsip"],
)
print(df)
print(df.loc["Arsip"])
text Keluaran
       suhu_c  lembap_pct
Lab A    24.1        60.2
Lab B    23.8        58.7
Arsip    25.0        61.0
suhu_c        25.0
lembap_pct    61.0
Name: Arsip, dtype: float64

Keluaran pertama menunjukkan label baris bukan lagi 0, 1, dan 2, melainkan nama ruangannya sendiri. Pemilihan df.loc["Arsip"] mengembalikan satu baris sebagai Series yang bernama Arsip, dan name inilah yang menyatakan label baris sumbernya. Label yang melekat pada baris juga membuat pengurutan tidak menghilangkan identitas baris, karena pengurutan memindahkan baris utuh beserta labelnya. Dengan label yang menempel, urutan tampilan dan urutan penyimpanan menjadi dua hal yang terpisah, sehingga pembacaan ulang tabel yang sudah disusun ulang tetap konsisten.

Panjang index harus sama dengan jumlah baris datanya, dan ketidakcocokan panjang menghasilkan ValueError yang dibahas pada bagian berikutnya. Index yang sudah terbentuk dapat ditata ulang kapan pun lewat set_index dan reset_index pada topik Penggantian Nama dan Pengurutan.

Kesalahan umum#

Kesalahan paling sering pada pembuatan DataFrame adalah panjang list antar kolom yang tidak sama. Konstruktor menggabungkan list menjadi kolom berdampingan, sehingga panjang yang berbeda membuat bentuk tabel tidak terdefinisi dan error dilempar sebelum tabel terbentuk. Potongan berikut mereproduksi error itu dan menangkapnya agar pesannya terbaca.

python Contoh: panjang kolom tidak sama
import pandas as pd

try:
    pd.DataFrame({"a": [1, 2, 3], "b": [4, 5]})
except ValueError as e:
    print(type(e).__name__)
    print(e)
text Keluaran
ValueError
All arrays must be of the same length

Pesan All arrays must be of the same length menyatakan syaratnya secara langsung, dan perbaikannya adalah menyamakan panjang semua list. Bila data memang tidak lengkap, celahnya diisi np.nan secara sadar agar panjangnya sama dan kekosongan tetap terlihat sebagai NaN. Kesalahan kedua adalah memberikan index yang panjangnya tidak cocok dengan data, misalnya satu label untuk dua nilai, dan errornya berbunyi Length of values (2) does not match length of index (1). Kedua pesan tersebut selalu menyebut angka panjangnya, sehingga kolom atau argumen yang salah segera ketahuan dari angkanya.

Ringkasan#

  • Dictionary berisi list menghasilkan kolom berlabel dengan RangeIndex, sedangkan dictionary berisi Series mewarisi index Series-nya.
  • List of dictionary membangun tabel per baris dengan kunci sebagai kolom dan NaN untuk kunci yang hilang pada suatu record.
  • Array NumPy dibangun per posisi dengan nama kolom dari argumen columns dan dtype yang mengikuti isi array.
  • Argumen index memberi label baris sejak awal, dengan syarat panjangnya sama dengan data, dan pelanggaran panjang menghasilkan ValueError.

Referensi#