Materi
Laporan rutin hampir selalu berupa ringkasan per kelompok: omzet per cabang, pengeluaran per pos, kehadiran per divisi. groupby dan agg sudah dibahas di kelas Analisis Data; yang baru di sini adalah bentuk keluarannya. Setelah agg, panggil reset_index() agar nama kelompok kembali menjadi kolom biasa, lalu tulis dengan to_excel(..., index=False). Tanpa reset_index, nama kelompok berada di indeks dan hilang bila ditulis dengan index=False.
rekap = (
df.groupby("divisi")
.agg(jam=("jam_lembur", "sum"), orang=("nama", "count"))
.reset_index()
.sort_values("jam", ascending=False)
)
rekap.to_excel("lembur.xlsx", sheet_name="Per Divisi", index=False)Satu sheet per kelompok dibuat dengan perulangan for nama, kelompok in df.groupby("cabang"): setiap putaran memberi nama kelompok dan DataFrame berisi barisnya saja, yang ditulis ke ExcelWriter dengan sheet_name=nama. Urutan kelompok mengikuti urutan abjad namanya.
Nama sheet punya aturan
Nama sheet tidak boleh memuat karakter / \ ? * [ ] :. Kategori "Kertas/Map" yang dipakai langsung sebagai nama sheet berhenti dengan ValueError: Invalid character / found in sheet title; ganti karakternya dengan str.replace("/", "-"). Nama yang lebih dari 31 karakter hanya memunculkan UserWarning, tetapi sebagian aplikasi tidak bisa membuka berkasnya, jadi pendekkan.