Array NumPy dari chapter sebelumnya cepat, tetapi kolomnya tidak bernama dan barisnya tidak beridentitas. Data nyata hampir selalu berlabel: nilai ulangan melekat pada nama siswa, transaksi melekat pada tanggal dan pelanggan, dan satu-dua sel biasanya kosong. pandas menyelesaikan kebutuhan itu dengan DataFrame — tabel berlabel yang dibangun di atas array NumPy — lengkap dengan alat baca file, penyaringan, agregasi, dan penanganan data hilang. Chapter ini membangun DataFrame sepuluh siswa dari chapter sebelumnya, membaca data yang sama dari file CSV, lalu menutup dengan skrip analisis utuh yang menangani satu nilai kosong.
DataFrame: Tabel Berlabel #
DataFrame paling mudah dibuat dari dictionary: setiap key menjadi nama kolom, dan setiap list menjadi isi kolomnya. Seluruh list harus sama panjang — pandas otomatis menomori baris dari 0:
import pandas as pd
df = pd.DataFrame({
"nama": ["Budi", "Siti", "Dewi", "Rina", "Agus",
"Bayu", "Citra", "Dodi", "Eka", "Fajar"],
"kelas": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"],
"matematika": [68, 75, 75, 81, 84, 88, 90, 92, 97, 70],
"bahasa": [70, 78, 74, 79, 85, 82, 88, 90, 94, 72],
})
print(df)
print()
print(df.head())Output yang Dihasilkan:
nama kelas matematika bahasa
0 Budi A 68 70
1 Siti A 75 78
2 Dewi A 75 74
3 Rina A 81 79
4 Agus A 84 85
5 Bayu B 88 82
6 Citra B 90 88
7 Dodi B 92 90
8 Eka B 97 94
9 Fajar B 70 72
nama kelas matematika bahasa
0 Budi A 68 70
1 Siti A 75 78
2 Dewi A 75 74
3 Rina A 81 79
4 Agus A 84 85Kolom nama dan kelas bertipe teks, sedangkan matematika dan bahasa menyimpan angka yang sama dengan dataset section ini. Method head() mengintip lima baris pertama tanpa mencetak seluruh tabel — kebiasaan yang berguna ketika data berisi ribuan baris. Angka di sisi kiri adalah index, label baris bawaan DataFrame.
Ringkasan Cepat dengan describe #
Satu baris describe() menghitung count, mean, standard deviation, minimum, kuartil, dan maksimum untuk seluruh kolom numerik sekaligus:
import pandas as pd
df = pd.DataFrame({
"nama": ["Budi", "Siti", "Dewi", "Rina", "Agus",
"Bayu", "Citra", "Dodi", "Eka", "Fajar"],
"kelas": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"],
"matematika": [68, 75, 75, 81, 84, 88, 90, 92, 97, 70],
"bahasa": [70, 78, 74, 79, 85, 82, 88, 90, 94, 72],
})
print(df[["matematika", "bahasa"]].describe())Output yang Dihasilkan:
matematika bahasa
count 10.000000 10.000000
mean 82.000000 81.200000
std 9.820613 8.024961
min 68.000000 70.000000
25% 75.000000 75.000000
50% 82.500000 80.500000
75% 89.500000 87.250000
max 97.000000 94.000000Baris count melaporkan banyak data non-kosong (10), mean 82 dan 81.2 mengulang hitungan sebelumnya, dan baris 25% / 50% / 75% adalah kuartil metode linear — 75, 82.5, 89.5 untuk matematika, konsisten dengan np.percentile default dari chapter Statistik dengan NumPy. Kolom teks sengaja tidak ikut dihitung; describe() pada kolom teks akan melaporkan jumlah nilai unik dan nilai terbanyak, format yang berbeda tujuan.
Menyeleksi, Menyaring, Mengurut, dan Mengagregasi #
Kurung siku adalah alat utama manipulasi DataFrame: satu nama kolom mengembalikan satu kolom, list nama kolom mengembalikan tabel baru, dan pembanding menghasilkan filter baris. Blok berikut merangkai seleksi, penyaringan, pengurutan, lalu dua bentuk agregasi — groupby dan value_counts — pada satu alur:
import pandas as pd
df = pd.DataFrame({
"nama": ["Budi", "Siti", "Dewi", "Rina", "Agus",
"Bayu", "Citra", "Dodi", "Eka", "Fajar"],
"kelas": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"],
"matematika": [68, 75, 75, 81, 84, 88, 90, 92, 97, 70],
"bahasa": [70, 78, 74, 79, 85, 82, 88, 90, 94, 72],
})
print(df[["nama", "matematika"]].head(3))
print()
print(df[df["matematika"] >= 80])
print()
print(df.sort_values("matematika", ascending=False).head(5))
print()
print(df.groupby("kelas")[["matematika", "bahasa"]].mean())
print()
print(df["kelas"].value_counts())Output yang Dihasilkan:
nama matematika
0 Budi 68
1 Siti 75
2 Dewi 75
nama kelas matematika bahasa
3 Rina A 81 79
4 Agus A 84 85
5 Bayu B 88 82
6 Citra B 90 88
7 Dodi B 92 90
8 Eka B 97 94
nama kelas matematika bahasa
8 Eka B 97 94
7 Dodi B 92 90
6 Citra B 90 88
5 Bayu B 88 82
4 Agus A 84 85
matematika bahasa
kelas
A 76.6 77.2
B 87.4 85.2
kelas
A 5
B 5
Name: count, dtype: int64Mari kita bedah hasilnya:
- Seleksi
df[["nama", "matematika"]]: memangkas tabel menjadi dua kolom;.head(3)memotong tiga baris pertama. - Filter
df[df["matematika"] >= 80]: bekerja dua langkah — pembanding menghasilkan barisan benar/salah per baris, lalu kurung siku luar mempertahankan baris bernilai benar; enam siswa lolos dan index baris aslinya tetap terbawa. sort_values("matematika", ascending=False): mengurutkan dari terbesar;head(5)memotong lima nilai tertinggi mulai dari Eka (97) sampai Agus (84).groupby("kelas")[["matematika", "bahasa"]].mean(): membagi baris menurut kelas, menghitung mean tiap kelompok, lalu menggabungkan hasilnya — pola split-apply-combine yang muncul lagi pada ANOVA di Section Pengujian Hipotesis. Rata-rata matematika kelas B (87.4) unggul 10.8 poin atas kelas A (76.6). Seleksi kolom sebelum.mean()diperlukan karena kolomnamabertipe teks dan tidak punya bentuk mean; tanpa seleksi, pandas menolak menjalankan agregasi numerik pada kolom teks.value_counts(): menghitung frekuensi tiap nilai — lima siswa kelas A dan lima kelas B, versi cepat dari tabel frekuensi pada chapter Tabel Frekuensi.
Membaca File CSV dan Data Hilang #
Analisis nyata jarang dimulai dari dictionary — data datang sebagai file. CSV (comma-separated values) adalah format paling umum: satu baris merepresentasikan satu entri data, kolom dipisah tanda koma. File berikut menambahkan satu baris baru — Gilang — dengan sel matematika sengaja dibiarkan kosong:
nama,kelas,matematika,bahasa
Budi,A,68,70
Siti,A,75,78
Dewi,A,75,74
Rina,A,81,79
Agus,A,84,85
Bayu,B,88,82
Citra,B,90,88
Dodi,B,92,90
Eka,B,97,94
Fajar,B,70,72
Gilang,A,,85pd.read_csv memuat file menjadi DataFrame dalam satu baris. Blok berikut membaca file tersebut, menghitung data hilang, lalu membandingkan dua strategi penanganan — jalankan dari folder yang sama dengan file nilai_siswa.csv:
import pandas as pd
df = pd.read_csv("nilai_siswa.csv")
print(df)
print()
print(df.isna().sum())
print()
bersih = df.dropna()
print("baris setelah dropna :", len(bersih))
df_isi = df.copy()
df_isi["matematika"] = df_isi["matematika"].fillna(df_isi["matematika"].mean())
print("matematika Gilang :", df_isi.loc[10, "matematika"])
print()
print(df_isi.tail(3))Output yang Dihasilkan:
nama kelas matematika bahasa
0 Budi A 68.0 70
1 Siti A 75.0 78
2 Dewi A 75.0 74
3 Rina A 81.0 79
4 Agus A 84.0 85
5 Bayu B 88.0 82
6 Citra B 90.0 88
7 Dodi B 92.0 90
8 Eka B 97.0 94
9 Fajar B 70.0 72
10 Gilang A NaN 85
nama 0
kelas 0
matematika 1
bahasa 0
dtype: int64
baris setelah dropna : 10
matematika Gilang : 82.0
nama kelas matematika bahasa
8 Eka B 97.0 94
9 Fajar B 70.0 72
10 Gilang A 82.0 85Mari kita bedah hasilnya:
- Sel kosong menjadi NaN: satu sel kosong membuat seluruh kolom matematika dibaca sebagai float (
68.0); pandas menandai sel kosong denganNaN— not a number — nilai khusus yang sama dengannp.nandari chapter sebelumnya. isna().sum()menghitung sel kosong per kolom: hanya matematika yang bernilai 1; kolom lain lengkap.dropna()membuang baris yang memuat NaN: jumlah baris turun dari 11 ke 10 — sederhana, tetapi satu baris data ikut terbuang seluruhnya.fillna()mengisi sel kosong: mean kolom matematika (82.0, dihitung pandas sambil melewati NaN) dipakai mengisi nilai Gilang;df.copy()dipakai agar DataFrame asli tetap utuh, dan.loc[10, "matematika"]mengambil sel pada baris index 10.
Skrip Lengkap: analisis_pandas.py #
Seluruh alur dirangkai menjadi satu skrip: baca CSV, periksa data hilang, bersihkan, ringkas, agregasi, dan saring. Simpan sebagai analisis_pandas.py di folder yang sama dengan nilai_siswa.csv, lalu jalankan dengan python3 analisis_pandas.py:
import pandas as pd
df = pd.read_csv("nilai_siswa.csv")
print("== Seluruh data ==")
print(df)
print()
print("== Jumlah data hilang per kolom ==")
print(df.isna().sum())
print()
bersih = df.dropna()
print("== Statistik kolom numerik (setelah dropna) ==")
print(bersih[["matematika", "bahasa"]].describe().round(2))
print()
print("== Rata-rata per kelas (setelah dropna) ==")
print(bersih.groupby("kelas")[["matematika", "bahasa"]].mean())
print()
print("== Siswa dengan matematika >= 80 ==")
print(bersih[bersih["matematika"] >= 80])Output yang Dihasilkan:
== Seluruh data ==
nama kelas matematika bahasa
0 Budi A 68.0 70
1 Siti A 75.0 78
2 Dewi A 75.0 74
3 Rina A 81.0 79
4 Agus A 84.0 85
5 Bayu B 88.0 82
6 Citra B 90.0 88
7 Dodi B 92.0 90
8 Eka B 97.0 94
9 Fajar B 70.0 72
10 Gilang A NaN 85
== Jumlah data hilang per kolom ==
nama 0
kelas 0
matematika 1
bahasa 0
dtype: int64
== Statistik kolom numerik (setelah dropna) ==
matematika bahasa
count 10.00 10.00
mean 82.00 81.20
std 9.82 8.02
min 68.00 70.00
25% 75.00 75.00
50% 82.50 80.50
75% 89.50 87.25
max 97.00 94.00
== Rata-rata per kelas (setelah dropna) ==
matematika bahasa
kelas
A 76.6 77.2
B 87.4 85.2
== Siswa dengan matematika >= 80 ==
nama kelas matematika bahasa
3 Rina A 81.0 79
4 Agus A 84.0 85
5 Bayu B 88.0 82
6 Citra B 90.0 88
7 Dodi B 92.0 90
8 Eka B 97.0 94Skrip memilih dropna() untuk pembersihan sehingga seluruh statistik berikutnya dihitung dari sepuluh data lengkap — angka mean 82, std 9.82, dan kuartil 75/82.5/89.5 kembali muncul, kini dihitung pandas. Setelah describe().round(2), agregasi groupby menghasilkan angka yang identik dengan DataFrame dari dictionary — membuktikan file CSV dan dictionary mengalir ke hasil akhir yang sama.
Selain CSV, pd.read_excel memuat file Excel dengan pola serupa (membutuhkan package tambahan seperti openpyxl), dan df.to_csv("nama.csv") menulis DataFrame kembali ke file. Satu kapabilitas pandas lagi layak disebut sebelum kita menutup: method rolling(). Ekspresi df["kolom"].rolling(3).mean() menghitung rata-rata bergerak tiga periode di atas data berurutan waktu — persis teknik Moving Average dari Section Analisis Deret Waktu, kini satu baris kode. Angka sudah tersedia rapi dalam tabel; langkah berikutnya adalah melihatnya. Chapter Visualisasi dengan matplotlib menggambar histogram, box plot, dan scatter plot dari DataFrame yang baru saja kita bangun.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
analisis_pandas.py
Unduh berkasimport pandas as pd
df = pd.read_csv("nilai_siswa.csv")
print("== Seluruh data ==")
print(df)
print()
print("== Jumlah data hilang per kolom ==")
print(df.isna().sum())
print()
bersih = df.dropna()
print("== Statistik kolom numerik (setelah dropna) ==")
print(bersih[["matematika", "bahasa"]].describe().round(2))
print()
print("== Rata-rata per kelas (setelah dropna) ==")
print(bersih.groupby("kelas")[["matematika", "bahasa"]].mean())
print()
print("== Siswa dengan matematika >= 80 ==")
print(bersih[bersih["matematika"] >= 80])