Skip to main content

Manipulasi DataFrame: Shuffling, Reset Index & Apply

Dalam proses analisis data dan Machine Learning, kita sering perlu melakukan manipulasi terhadap DataFrame.

Beberapa manipulasi yang umum dilakukan antara lain:

  • Mengacak urutan baris data.
  • Mengatur ulang index setelah data diacak.
  • Menerapkan fungsi tertentu ke setiap nilai dalam sebuah kolom.
  • Mengubah format atau satuan data.

Pada materi ini kita akan mempelajari tiga fungsi Pandas yang penting:

  • .sample()
  • .reset_index()
  • .apply()

Kita juga akan mengenal penggunaan lambda untuk membuat fungsi sederhana.


1. Mengacak Urutan Data dengan .sample()

Method .sample() digunakan untuk mengambil sampel data secara acak dari DataFrame.

Salah satu penggunaannya adalah untuk melakukan shuffling, yaitu mengacak urutan baris dalam dataset.

Sintaks dasar:

df_shuffled = df.sample(frac=1)

Parameter frac menentukan berapa bagian data yang ingin diambil.

Parameter frac

Beberapa contoh nilai frac:

NilaiArti
0.1Mengambil 10% data
0.2Mengambil 20% data
0.5Mengambil 50% data
1Mengambil 100% data

Jika ingin mengacak seluruh DataFrame:

car_sales_shuffled = car_sales.sample(frac=1)

Semua baris tetap ada, tetapi urutannya menjadi acak.

Mengambil Sebagian Data

.sample() juga dapat digunakan untuk mengambil sebagian data.

Contoh:

car_sales_sample = car_sales.sample(frac=0.2)

Kode tersebut mengambil sekitar 20% dari seluruh data secara acak.

Ini dapat berguna ketika kita ingin melakukan eksperimen menggunakan dataset yang lebih kecil.


2. Mengapa Data Perlu Diacak?

Pengacakan data dapat menjadi bagian penting dalam Machine Learning.

Bayangkan sebuah dataset memiliki pola seperti:

Baris 1-100 → Mobil Toyota
Baris 101-200 → Mobil Honda
Baris 201-300 → Mobil BMW

Jika dataset digunakan dalam kondisi tersebut tanpa memperhatikan urutan datanya, pembagian data untuk proses Machine Learning berpotensi menghasilkan distribusi yang kurang representatif.

Dengan melakukan shuffling:

car_sales_shuffled = car_sales.sample(frac=1)

data dapat memiliki urutan yang lebih acak.

Secara sederhana:

Data asli

Toyota → Toyota → Honda → Honda → BMW → BMW

Shuffle

Honda → BMW → Toyota → Honda → BMW → Toyota

Namun, perlu diperhatikan bahwa tidak semua dataset boleh diacak sembarangan.

Contohnya adalah data yang memiliki hubungan berdasarkan waktu seperti:

  • data saham,
  • data sensor,
  • data transaksi berdasarkan waktu,
  • data cuaca,
  • data time series.

Untuk data seperti ini, urutan waktu dapat memiliki arti penting sehingga strategi pembagian data harus mempertahankan urutan temporal.


3. Mengontrol Hasil Pengacakan dengan random_state

Karena .sample() melakukan pengacakan, hasilnya dapat berbeda setiap kali kode dijalankan.

Contoh:

car_sales_shuffled = car_sales.sample(frac=1)

Jika dijalankan kembali, urutan data dapat berubah lagi.

Untuk eksperimen Machine Learning, kita sering ingin mendapatkan hasil pengacakan yang sama agar eksperimen dapat direproduksi.

Kita dapat menggunakan random_state:

car_sales_shuffled = car_sales.sample(
frac=1,
random_state=42
)

Dengan random_state yang sama, proses pengacakan akan menghasilkan urutan yang konsisten.

Angka 42 bukan angka khusus. Kita dapat menggunakan angka lain, misalnya:

random_state=10

atau:

random_state=123

Yang penting adalah menggunakan nilai yang konsisten ketika ingin mereproduksi eksperimen.


4. Mengatur Ulang Index dengan .reset_index()

Setelah melakukan shuffling, index DataFrame biasanya ikut berpindah bersama barisnya.

Misalnya sebelum diacak:

index Make
0 toyota
1 honda
2 bmw
3 ford

Setelah diacak, bisa menjadi:

index Make
2 bmw
0 toyota
3 ford
1 honda

Urutan baris sudah berubah, tetapi index lama tetap dibawa.

Jika kita ingin membuat index baru dari 0, 1, 2, 3, ..., gunakan:

car_sales_shuffled = car_sales_shuffled.reset_index(drop=True)

Hasilnya:

index Make
0 bmw
1 toyota
2 ford
3 honda

5. Parameter drop=True

Secara default, .reset_index() akan mempertahankan index lama sebagai kolom baru.

Contoh:

car_sales_shuffled = car_sales_shuffled.reset_index()

Hasilnya dapat menjadi:

index Make
2 bmw
0 toyota
3 ford
1 honda

Index lama akan dipindahkan menjadi kolom.

Jika kita tidak membutuhkan index lama, gunakan:

car_sales_shuffled = car_sales_shuffled.reset_index(drop=True)

Parameter:

drop=True

berarti index lama tidak disimpan sebagai kolom.


6. Menggunakan inplace=True

Alternatif lainnya adalah mengubah DataFrame secara langsung:

car_sales_shuffled.reset_index(
drop=True,
inplace=True
)

Dengan cara ini, kita tidak perlu melakukan assignment kembali.

Namun, dalam kode pembelajaran dan pengembangan pipeline data, assignment seperti:

car_sales_shuffled = car_sales_shuffled.reset_index(drop=True)

sering lebih mudah dibaca karena hasil operasi terlihat jelas disimpan kembali.


7. Kombinasi .sample() dan .reset_index()

Kedua method ini sering digunakan secara berurutan.

Contoh:

car_sales_shuffled = car_sales.sample(
frac=1,
random_state=42
)

car_sales_shuffled = car_sales_shuffled.reset_index(drop=True)

Atau dapat ditulis lebih ringkas:

car_sales_shuffled = car_sales.sample(
frac=1,
random_state=42
).reset_index(drop=True)

Alurnya:

DataFrame

.sample(frac=1)

Baris diacak

.reset_index(drop=True)

Index dibuat kembali

Ini merupakan pola yang cukup umum dalam pengolahan dataset.


8. Menerapkan Fungsi dengan .apply()

Method .apply() digunakan untuk menerapkan sebuah fungsi pada data.

Misalnya kita memiliki kolom:

Odometer (KM)

dan ingin mengubah nilai dari kilometer menjadi miles.

Rumus sederhananya:

Miles = Kilometer / 1.6

Kita dapat menggunakan .apply():

car_sales["Odometer (KM)"] = car_sales["Odometer (KM)"].apply(
lambda x: x / 1.6
)

Pandas akan menerapkan operasi tersebut pada setiap nilai dalam kolom.

Misalnya:

160 km → 100 miles
320 km → 200 miles
800 km → 500 miles

9. Memahami lambda

Pada contoh sebelumnya terdapat:

lambda x: x / 1.6

lambda digunakan untuk membuat fungsi sederhana secara singkat.

Contoh fungsi biasa:

def kilometer_to_miles(x):
return x / 1.6

Fungsi tersebut dapat digunakan dengan .apply():

car_sales["Odometer (KM)"] = car_sales["Odometer (KM)"].apply(
kilometer_to_miles
)

Dengan lambda, fungsi tersebut dapat ditulis lebih singkat:

car_sales["Odometer (KM)"] = car_sales["Odometer (KM)"].apply(
lambda x: x / 1.6
)

Keduanya melakukan operasi yang sama.


10. Cara Kerja .apply() dan lambda

Perhatikan kode:

car_sales["Odometer (KM)"].apply(
lambda x: x / 1.6
)

Kita dapat membacanya seperti:

Ambil setiap nilai pada Odometer

Masukkan nilai tersebut ke x

Hitung x / 1.6

Simpan hasilnya sebagai nilai baru

Misalnya terdapat data:

Odometer (KM)
160
320
800

Maka:

160 / 1.6 = 100
320 / 1.6 = 200
800 / 1.6 = 500

11. Contoh .apply() Lainnya

.apply() tidak hanya dapat digunakan untuk konversi satuan.

Misalnya kita ingin mengubah nilai menjadi huruf kecil:

car_sales["Make"] = car_sales["Make"].apply(
lambda x: x.lower()
)

Atau membuat kondisi sederhana:

car_sales["High mileage"] = car_sales["Odometer (KM)"].apply(
lambda x: x > 100000
)

Hasilnya dapat berupa:

Odometer (KM) High mileage
50000 False
120000 True
80000 False
150000 True

Dengan demikian, .apply() dapat digunakan untuk membuat transformasi berdasarkan aturan tertentu.


12. .apply() vs Operasi Vectorized Pandas

Meskipun .apply() sangat fleksibel, tidak selalu menjadi pilihan pertama.

Untuk operasi sederhana yang sudah didukung langsung oleh Pandas, operasi vectorized biasanya lebih sederhana dan dapat lebih efisien.

Contohnya, untuk mengubah kilometer menjadi miles, kita dapat langsung melakukan:

car_sales["Odometer (Miles)"] = car_sales["Odometer (KM)"] / 1.6

Tidak perlu menggunakan:

car_sales["Odometer (Miles)"] = car_sales["Odometer (KM)"].apply(
lambda x: x / 1.6
)

Keduanya dapat menghasilkan hasil yang sama.

Secara umum:

Operasi sederhana

Gunakan operasi Pandas langsung jika memungkinkan

Operasi khusus/aturan tertentu

Gunakan .apply()

Ini merupakan kebiasaan yang baik ketika bekerja dengan Pandas.


13. Contoh Lengkap

Berikut contoh workflow sederhana yang menggabungkan .sample(), .reset_index(), dan .apply().

import pandas as pd

car_sales = pd.DataFrame({
"Make": ["toyota", "honda", "bmw", "ford"],
"Odometer (KM)": [150000, 120000, 90000, 80000],
"Price": [12000, 15000, 25000, 18000]
})

# Mengacak seluruh data
car_sales_shuffled = car_sales.sample(
frac=1,
random_state=42
)

# Mengatur ulang index
car_sales_shuffled = car_sales_shuffled.reset_index(drop=True)

# Mengubah kilometer menjadi miles
car_sales_shuffled["Odometer (Miles)"] = (
car_sales_shuffled["Odometer (KM)"] / 1.6
)

print(car_sales_shuffled)

Perhatikan bahwa pada contoh terakhir kita tidak menggunakan .apply() karena pembagian langsung merupakan operasi vectorized yang lebih sederhana.

Jika ingin memahami .apply(), kita juga dapat menulis:

car_sales_shuffled["Odometer (Miles)"] = (
car_sales_shuffled["Odometer (KM)"].apply(
lambda x: x / 1.6
)
)

Kedua pendekatan tersebut dapat menghasilkan nilai yang sama.


14. .sample() untuk Eksperimen Dataset Besar

Ketika bekerja dengan dataset yang sangat besar, kita mungkin tidak selalu perlu menggunakan seluruh data pada tahap eksperimen awal.

Misalnya dataset memiliki jutaan baris.

Kita dapat mengambil sebagian data:

car_sales_sample = car_sales.sample(
frac=0.01,
random_state=42
)

Dengan frac=0.01, kita mengambil sekitar 1% data.

Hal ini dapat membantu ketika:

  • menguji kode,
  • mencari kesalahan,
  • mencoba transformasi,
  • melakukan eksplorasi awal,
  • menguji pipeline sebelum dijalankan pada seluruh dataset.

Setelah kode berjalan dengan benar, kita dapat menjalankannya pada dataset yang lebih besar.


15. Hal yang Perlu Diperhatikan

15.1 Jangan Selalu Mengacak Data Time Series

Data yang memiliki hubungan waktu membutuhkan perhatian khusus.

Contohnya:

Tanggal 1
Tanggal 2
Tanggal 3
Tanggal 4
...

Mengacak data dapat menghilangkan struktur temporal yang penting.

Untuk Machine Learning berbasis time series, pembagian training dan testing biasanya perlu mempertahankan urutan waktu.

15.2 Gunakan random_state untuk Reproducibility

Saat melakukan eksperimen, gunakan random_state agar hasil pengacakan dapat direproduksi.

Contoh:

df.sample(frac=1, random_state=42)

15.3 Periksa Data Sebelum dan Sesudah Manipulasi

Biasakan memeriksa DataFrame:

car_sales.head()

Kemudian setelah manipulasi:

car_sales_shuffled.head()

Kita juga dapat memeriksa informasi DataFrame:

car_sales_shuffled.info()

Dengan demikian, kita dapat memastikan bahwa perubahan benar-benar sesuai dengan yang diharapkan.


16. Ringkasan Method yang Dipelajari

MethodKegunaan
.sample()Mengambil sampel data secara acak
.sample(frac=1)Mengacak seluruh baris DataFrame
.sample(frac=0.2)Mengambil sekitar 20% data
.reset_index()Membuat kembali index DataFrame
.reset_index(drop=True)Membuat index baru tanpa menyimpan index lama
.apply()Menerapkan fungsi pada data
lambdaMembuat fungsi sederhana secara singkat

17. Workflow Manipulasi Data

Secara umum, proses yang dipelajari dapat digambarkan sebagai berikut:

DataFrame

Periksa data

Shuffle jika diperlukan

Reset index

Transformasi data

Periksa kembali hasil

Gunakan untuk analisis / Machine Learning

Tidak semua dataset membutuhkan seluruh tahapan tersebut.

Kita harus memilih operasi berdasarkan karakteristik dan tujuan penggunaan data.


Checklist

Sebelum melanjutkan ke materi berikutnya, pastikan Anda sudah memahami:

  • Apa fungsi .sample().
  • Cara mengacak seluruh DataFrame menggunakan frac=1.
  • Cara mengambil sebagian data menggunakan frac.
  • Mengapa random_state penting untuk reproducibility.
  • Cara menggunakan .reset_index().
  • Perbedaan reset_index() dan reset_index(drop=True).
  • Cara menggunakan .apply().
  • Apa fungsi lambda.
  • Cara menerapkan fungsi pada setiap nilai kolom.
  • Perbedaan operasi vectorized dengan .apply().
  • Mengapa data time series tidak boleh diacak sembarangan.
  • Pentingnya memeriksa data sebelum dan sesudah manipulasi.