Cheat Sheet Pandas
Terakhir diperbarui
Membuat DataFrame
DataFrame kecil yang dibuat manual, untuk contoh, pengujian, dan tabel acuan.
| Tugas | Kode |
|---|---|
| Mengimpor pandas dan NumPy | import pandas as pd
import numpy as np |
| Dari dict berisi kolom | df = pd.DataFrame({"name": ["Ada", "Ben"], "age": [36, 28]}) |
| Dari list berisi baris | pd.DataFrame([{"name": "Ada", "age": 36}, {"name": "Ben", "age": 28}]) |
| Dari array NumPy | pd.DataFrame(np.arange(6).reshape(3, 2), columns=["x", "y"]) |
| Series dengan label | s = pd.Series([3, 5, 2], index=["a", "b", "c"]) |
| Rentang tanggal | pd.date_range("2026-01-01", periods=7, freq="D") |
Membaca dan menulis file
Satu pemanggilan memuat file ke DataFrame, dan satu pemanggilan menulisnya kembali.
| Tugas | Kode |
|---|---|
| Membaca file CSV | df = pd.read_csv("sales.csv") |
| Hanya kolom tertentu, dengan tanggal yang sebenarnya | pd.read_csv("sales.csv", usecols=["date", "city", "sales"], parse_dates=["date"]) |
| Memakai sebuah kolom sebagai index | pd.read_csv("sales.csv", index_col="id") |
| Pemisah tab atau lainnya | pd.read_csv("sales.tsv", sep="\t") |
| Menganggap penanda tambahan sebagai nilai hilang | pd.read_csv("sales.csv", na_values=["n/a", "-"]) |
| Hanya membaca baris-baris pertama | pd.read_csv("sales.csv", nrows=1000) |
| Membaca sheet Excel (butuh openpyxl) | pd.read_excel("report.xlsx", sheet_name="2026") |
| Membaca record JSON | pd.read_json("records.json") |
| Membaca dari database SQL | pd.read_sql("SELECT * FROM orders", conn) |
| Menulis CSV tanpa index | df.to_csv("clean.csv", index=False) |
| Menulis Excel atau Parquet | df.to_excel("clean.xlsx", index=False), df.to_parquet("clean.parquet") |
Memeriksa data
Pemanggilan pertama yang dilakukan pada dataset baru mana pun.
| Tugas | Kode |
|---|---|
| Baris pertama dan terakhir | df.head(), df.tail(3) |
| Jumlah baris dan kolom | df.shape # (6, 7) |
| Tipe kolom dan jumlah nilai yang tidak kosong | df.info() |
| Statistik ringkasan kolom numerik | df.describe() |
| Ringkasan setiap kolom | df.describe(include="all") |
| Nama dan tipe kolom | df.columns, df.dtypes |
| Menghitung setiap nilai | df["city"].value_counts() |
| Porsi setiap nilai | df["city"].value_counts(normalize=True) |
| Nilai unik dan jumlahnya | df["city"].unique(), df["city"].nunique() |
| Nilai hilang per kolom | df.isna().sum() |
| Sampel baris acak | df.sample(3, random_state=0) |
| Korelasi kolom numerik | df.corr(numeric_only=True) |
Memilih kolom dan baris
loc memilih berdasarkan label dan menyertakan ujung slice. iloc memilih berdasarkan posisi dan tidak menyertakannya.
| Tugas | Kode |
|---|---|
| Satu kolom, sebagai Series | df["age"] |
| Beberapa kolom, sebagai DataFrame | df[["name", "age"]] |
| Baris dan kolom berdasarkan label | df.loc[0:2, ["name", "age"]] |
| Baris dan kolom berdasarkan posisi | df.iloc[0:2, 0:3] |
| Satu nilai | df.at[0, "age"], df.iat[0, 3] |
| Baris terakhir | df.iloc[-1] |
| Kolom dengan satu tipe | df.select_dtypes(include="number") |
| Kolom teks (pandas 3) | df.select_dtypes(include="str") |
| Kolom berdasarkan kecocokan nama | df.filter(like="sal"), df.filter(regex="^(age|salary)$") |
| Mencari baris berdasarkan sebuah kolom | df.set_index("name").loc["Ada", "salary"] |
| Kembali ke index 0, 1, 2 | df.reset_index(drop=True) |
| Membuang kolom atau baris | df.drop(columns=["email"]), df.drop(index=[0, 1]) |
Menyaring baris
Bungkus setiap kondisi dengan tanda kurung lalu gabungkan dengan & (dan), | (atau), dan ~ (bukan).
| Tugas | Kode |
|---|---|
| Baris yang memenuhi kondisi | df[df["age"] > 30] |
| Kedua kondisi | df[(df["age"] > 30) & (df["city"] == "Oslo")] |
| Salah satu kondisi | df[(df["city"] == "Oslo") | (df["salary"] > 6000)] |
| Nilai ada di dalam list | df[df["city"].isin(["Oslo", "Rome"])] |
| Nilai tidak ada di dalam list | df[~df["city"].isin(["Oslo", "Rome"])] |
| Di antara dua nilai, ujungnya termasuk | df[df["age"].between(30, 40)] |
| Menyaring dengan string query | df.query("age > 30 and city == 'Oslo'") |
| Memakai variabel di dalam query | min_age = 30
df.query("age > @min_age") |
| Teks mengandung | df[df["name"].str.contains("e", case=False)] |
| Nilai hilang atau ada | df[df["age"].isna()], df[df["age"].notna()] |
| Menyaring baris dan memilih kolom | df.loc[df["age"] > 30, ["name", "salary"]] |
| n baris teratas atau terbawah | df.nlargest(3, "salary"), df.nsmallest(2, "age") |
| Baris dengan nilai yang berulang | df[df.duplicated(subset=["city"], keep=False)] |
Mengurutkan dan memberi peringkat
| Tugas | Kode |
|---|---|
| Mengurutkan berdasarkan kolom | df.sort_values("salary") |
| Terbesar lebih dulu | df.sort_values("salary", ascending=False) |
| Mengurutkan berdasarkan beberapa kolom | df.sort_values(["city", "salary"], ascending=[True, False]) |
| Nilai hilang lebih dulu | df.sort_values("age", na_position="first") |
| Mengurutkan berdasarkan index | df.sort_index() |
| Memberi peringkat, 1 adalah yang tertinggi | df["salary"].rank(ascending=False) |
Menambah dan mengubah kolom
Operasi pada seluruh kolom berjalan cepat. Pakai apply hanya jika tidak ada method bawaan yang bisa melakukannya.
| Tugas | Kode |
|---|---|
| Kolom baru dari kolom lain | df["bonus"] = df["salary"] * 0.1 |
| Menambah kolom di dalam rangkaian (chain) | df.assign(bonus=lambda d: d["salary"] * 0.1) |
| Nilai berdasarkan kondisi | df["level"] = np.where(df["age"] >= 40, "senior", "junior") |
| Nilai berdasarkan beberapa kondisi | df["band"] = np.select([df["age"] < 30, df["age"] < 45], ["young", "mid"], default="senior") |
| Mengubah nilai saat kondisi terpenuhi | df.loc[df["city"] == "Lima", "salary"] = 4000 |
| Memetakan nilai dengan dict | df["country"] = df["city"].map({"Oslo": "NO", "Rome": "IT", "Lima": "PE"}) |
| Menerapkan fungsi pada kolom | df["salary"].apply(lambda x: round(x, -3)) |
| Menerapkan fungsi pada setiap sel | df[["age", "salary"]].map(lambda x: x / 1000) |
| Mengganti nama kolom | df.rename(columns={"salary": "pay"}) |
| Mengubah tipe kolom | df["salary"].astype("float64") |
| Teks menjadi angka, nilai tidak valid menjadi NaN | pd.to_numeric(s, errors="coerce") |
| Angka ke dalam kelompok berlabel | pd.cut(df["age"], bins=[0, 30, 45, 120], labels=["young", "mid", "senior"]) |
| Angka ke dalam kelompok berukuran sama | pd.qcut(df["salary"], q=4, labels=False) |
| Perulangan atas baris (lambat, pilihan terakhir) | for row in df.itertuples():
print(row.name, row.salary) |
Nilai hilang dan pembersihan
Angka yang hilang tampil sebagai NaN, tanggal yang hilang sebagai NaT. Setiap pemanggilan ini mengembalikan object baru, jadi simpan hasilnya.
| Tugas | Kode |
|---|---|
| Porsi nilai hilang per kolom | df.isna().mean() |
| Membuang baris yang punya nilai hilang | df.dropna() |
| Membuang baris yang tidak punya kolom kunci | df.dropna(subset=["age"]) |
| Mengisi dengan nilai per kolom | df.fillna({"age": df["age"].median()}) |
| Mengisi dari baris sebelumnya atau berikutnya | df["age"].ffill(), df["age"].bfill() |
| Mengisi celah dengan interpolasi | df["age"].interpolate() |
| Mengubah penanda menjadi nilai hilang | df.replace(["n/a", "-", ""], np.nan) |
| Membuang baris duplikat | df.drop_duplicates() |
| Menyimpan baris terakhir per key | df.drop_duplicates(subset=["city"], keep="last") |
| Merapikan nama kolom | df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_") |
| Membatasi nilai ekstrem | df["salary"].clip(lower=4000, upper=6000) |
| Tipe category untuk teks yang berulang | df["city"] = df["city"].astype("category") |
Kolom teks (.str)
Di pandas 3 kolom teks mendapat dtype str secara default. Method .str bekerja pada seluruh kolom, dan nilai yang hilang tetap hilang.
| Tugas | Kode |
|---|---|
| Huruf besar, kecil, atau kapital di awal kata | df["name"].str.upper(), df["name"].str.lower(), df["name"].str.title() |
| Menghapus spasi di tepi | df["name"].str.strip() |
| Mengganti teks | df["email"].str.replace("mail.com", "example.com") |
| Mengganti dengan regex | df["email"].str.replace(r"@.*", "", regex=True) |
| Mengandung, diawali dengan | df["name"].str.contains("a"), df["name"].str.startswith("E") |
| Panjang setiap nilai | df["name"].str.len() |
| Karakter-karakter pertama | df["name"].str[:2] |
| Memecah menjadi kolom | df["email"].str.split("@", expand=True) |
| Mengambil bagian dengan grup regex | df["email"].str.extract(r"@(\w+)") |
| Menggabungkan kolom teks | df["name"] + " (" + df["city"] + ")" |
| Menambahkan nol di depan angka | df["salary"].astype("str").str.zfill(6) |
| Dtype teks yang baru | df["name"].dtype # str |
Tanggal dan waktu
Accessor .dt bekerja pada kolom datetime. Index tanggal yang terurut (ts di bawah) memungkinkan slicing dengan teks dan resampling.
| Tugas | Kode |
|---|---|
| Mengubah kolom menjadi datetime | df["date"] = pd.to_datetime(df["date"]) |
| Mengubah dengan format yang tepat | pd.to_datetime(["03/01/2026", "15/01/2026"], format="%d/%m/%Y") |
| Tahun, bulan, nama hari | df["date"].dt.year, df["date"].dt.month, df["date"].dt.day_name() |
| Mengelompokkan tanggal per bulan | df["date"].dt.to_period("M") |
| Jumlah hari di antara dua tanggal | (pd.Timestamp("2026-12-31") - df["date"]).dt.days |
| Menambah hari atau bulan | df["date"] + pd.Timedelta(days=30), df["date"] + pd.DateOffset(months=1) |
| Baris dalam rentang tanggal | df[df["date"].between("2021-01-01", "2022-12-31")] |
| Index tanggal, dipotong dengan teks | ts = df.set_index("date").sort_index()
ts.loc["2021":"2022"] |
| Total per bulan | ts["salary"].resample("ME").sum() |
Rata-rata mingguan; "QE" per kuartal, "YE" per tahun | ts["salary"].resample("W").mean() |
| Rata-rata bergulir (rolling) | ts["salary"].rolling(3).mean() |
| Perubahan dari baris sebelumnya | ts["salary"].diff(), ts["salary"].pct_change() |
| Menggeser nilai turun satu baris | ts["salary"].shift(1) |
| Total berjalan | ts["salary"].cumsum() |
| Mengatur dan mengonversi zona waktu | ts.index.tz_localize("UTC").tz_convert("Europe/Oslo") |
Group dan agregasi
groupby memecah baris berdasarkan key, menerapkan fungsi pada setiap grup, lalu menggabungkan hasilnya.
| Tugas | Kode |
|---|---|
| Rata-rata per grup | df.groupby("city")["salary"].mean() |
| Beberapa statistik sekaligus | df.groupby("city")["salary"].agg(["mean", "max", "count"]) |
| Kolom hasil bernama | df.groupby("city").agg(avg_pay=("salary", "mean"), people=("name", "count")) |
| Group berdasarkan dua kolom | df.groupby(["city", "team"])["salary"].sum() |
| Menjaga key tetap sebagai kolom | df.groupby("city", as_index=False)["salary"].mean() |
| Jumlah baris per grup | df.groupby("city").size() |
| Hasil grup di setiap baris | df["city_avg"] = df.groupby("city")["salary"].transform("mean") |
| Hanya menyimpan grup tertentu | df.groupby("city").filter(lambda g: len(g) >= 2) |
| Baris dengan nilai maksimum per grup | df.loc[df.groupby("city")["salary"].idxmax()] |
| n baris teratas per grup | df.sort_values("salary", ascending=False).groupby("city").head(2) |
| Memberi nomor baris di setiap grup | df.groupby("city").cumcount() |
| Perulangan atas grup | for city, group in df.groupby("city"):
print(city, len(group)) |
| Menyaring, group, dan mengurutkan dalam satu rangkaian | (df.query("age > 30")
.groupby("city", as_index=False)
.agg(avg_pay=("salary", "mean"))
.sort_values("avg_pay", ascending=False)) |
Pivot dan reshape
Data panjang (long) punya satu baris per observasi. Data lebar (wide) menyebar satu variabel ke beberapa kolom.
| Tugas | Kode |
|---|---|
| Pivot table | df.pivot_table(index="city", columns="team", values="salary", aggfunc="mean", fill_value=0) |
| Pivot table dengan total | df.pivot_table(index="city", values="salary", aggfunc="sum", margins=True) |
| Menghitung kombinasi | pd.crosstab(df["city"], df["team"]) |
| Porsi per baris | pd.crosstab(df["city"], df["team"], normalize="index") |
| Lebar ke panjang | long = df.melt(id_vars="name", value_vars=["age", "salary"], var_name="field", value_name="value") |
| Panjang ke lebar | long.pivot(index="name", columns="field", values="value") |
| Level index dalam menjadi kolom | df.groupby(["city", "team"])["salary"].sum().unstack(fill_value=0) |
| Satu baris per item list | pd.DataFrame({"id": [1, 2], "tags": [["a", "b"], ["c"]]}).explode("tags") |
| One-hot encoding sebuah kolom | pd.get_dummies(df["team"], prefix="team") |
| Menukar baris dan kolom | df.T |
Menggabungkan DataFrame
concat menumpuk frame, merge menggabungkannya berdasarkan kolom kunci seperti SQL.
| Tugas | Kode |
|---|---|
| Menumpuk baris | pd.concat([df_2025, df_2026], ignore_index=True) |
| Menaruh berdampingan | pd.concat([left, right], axis=1) |
| Join berdasarkan kolom kunci | orders.merge(customers, on="customer_id", how="left") |
| Jenis join | how="inner", "left", "right", "outer" |
| Key dengan nama berbeda | orders.merge(users, left_on="customer_id", right_on="id") |
| Memeriksa join dan menandai sumber setiap baris | orders.merge(customers, on="customer_id", how="left", validate="many_to_one", indicator=True) |
| Join berdasarkan index | left.join(right, how="inner") |
| Baris tanpa pasangan di tabel lain | orders[~orders["customer_id"].isin(customers["customer_id"])] |
Plot dengan pandas
pandas menggambar dengan Matplotlib. Setiap pemanggilan plot mengembalikan ax Matplotlib, jadi kamu bisa terus mengatur tampilannya.
| Tugas | Kode |
|---|---|
| Grafik garis dari sebuah series | ts["salary"].plot() |
| Grafik garis dari dua kolom | df.plot(x="date", y="salary") |
| Grafik batang dari sebuah ringkasan | df.groupby("city")["salary"].mean().plot.bar() |
| Batang horizontal yang terurut | df["city"].value_counts().sort_values().plot.barh() |
| Histogram | df["salary"].plot.hist(bins=20) |
| Scatter plot | df.plot.scatter(x="age", y="salary") |
| Box plot per grup | df.boxplot(column="salary", by="city") |
| Judul dan label sumbu | ax = df.plot(x="date", y="salary", title="Salary")
ax.set_ylabel("EUR") |
| Menampilkan atau menyimpan grafik | plt.show(), ax.figure.savefig("salary.png", dpi=150) |
pandas 3: bentuk lama dan yang ditulis sekarang
Kode yang disalin dari tutorial lama sering gagal atau memunculkan peringatan di pandas 3. Tulis bentuk di kolom pandas 3 sebagai gantinya.
| Tugas | pandas 3 | Bentuk lama |
|---|---|---|
| Fungsi pada setiap sel | df.map(f) | df.applymap(f) |
| Mengisi dari baris sebelumnya | df.ffill() | df.fillna(method="ffill") |
| Menambah baris | pd.concat([df, new_rows]) | df.append(new_rows) |
| Resampling akhir bulan | ts["salary"].resample("ME").sum() | resample("M") |
| Tanggal per jam | pd.date_range("2026-01-01", periods=24, freq="h") | freq="H" |
| Mengisi satu nilai | df.loc[0, "age"] = 37 | df["age"][0] = 37 |
| Mengubah subset hasil saringan | high = df[df["salary"] > 5000]
high["salary"] = 0 | high = df[df["salary"] > 5000].copy() |
| Apakah ini kolom teks? | df["name"].dtype == "str" | df["name"].dtype == object |
Kode pandas yang dipakai seorang data analyst setiap hari, dikelompokkan per tugas: membuat dan memuat data, memeriksanya, memilih dan menyaring baris, menambah kolom, membersihkan nilai yang hilang, mengolah teks dan tanggal, group dan agregasi, reshape, merge, dan plot. Setiap baris berisi potongan kode singkat yang bisa kamu tempel, plus satu kalimat tentang kegunaannya.
Semua yang ada di sini ditulis untuk pandas 3, versi yang dijalankan Coddy: kolom teks memakai dtype str yang baru, Copy-on-Write selalu aktif, dan API yang sudah dihapus seperti applymap dan fillna(method=...) hanya muncul di tabel bentuk lama. Contoh-contohnya memakai DataFrame df dengan kolom name, city, team, age, salary, date, dan email. Baru mengenal Python? Mulailah dari cheat sheet Python dan playground Python, dan simpan juga cheat sheet NumPy, Matplotlib, dan scikit-learn di samping halaman ini.
FAQ cheat sheet pandas
Apakah cheat sheet pandas ini gratis?
Ya. Cheat sheet pandas ini sepenuhnya gratis, tanpa perlu daftar. Simpan di bookmark, atau cetak ke PDF dari browsermu, dan kembali kapan pun kamu butuh pemanggilan yang tepat untuk groupby, merge, atau pivot table.
Versi pandas mana yang dibahas cheat sheet ini?
str yang baru, Copy-on-Write selalu aktif, dan pemanggilan yang dihapus di pandas 3 (applymap, fillna(method=...), append, alias frekuensi M dan H) hanya muncul di tabel terakhir, di samping apa yang sebaiknya ditulis sekarang. Hampir semua potongan kode juga berjalan di pandas 2.2, kecuali baris yang mengandalkan dtype str atau Copy-on-Write.Apa perbedaan loc dan iloc?
loc memilih berdasarkan label, yaitu nilai index dan nama kolom, dan slice seperti df.loc[0:2] menyertakan ujungnya. iloc memilih berdasarkan posisi bilangan bulat, seperti list Python, jadi df.iloc[0:2] mengembalikan dua baris pertama dan tidak menyertakan ujungnya. Pakai loc dengan kondisi untuk menyaring baris sekaligus memilih kolom dalam satu langkah: df.loc[df["age"] > 30, ["name"]].Bagaimana cara menyaring DataFrame dengan beberapa kondisi?
& untuk dan, | untuk atau, dan ~ untuk bukan: df[(df["age"] > 30) & (df["city"] == "Oslo")]. and dan or milik Python tidak bekerja pada seluruh kolom. Untuk saringan yang panjang, df.query("age > 30 and city == 'Oslo'") lebih mudah dibaca.Apa perbedaan merge, join, dan concat?
merge menggabungkan dua DataFrame berdasarkan kolom kunci, seperti join di SQL, dengan how="inner", "left", "right", atau "outer". join adalah jalan pintas yang melakukan merge berdasarkan index. concat sama sekali tidak mencocokkan key: frame hanya ditumpuk satu di atas yang lain, atau berdampingan dengan axis=1.Kenapa assignment saya tidak mengubah DataFrame?
df["age"][0] = 37 mengubah object sementara dan membiarkan df tidak tersentuh. Tulis sebagai satu pemanggilan loc: df.loc[0, "age"] = 37. Method seperti dropna dan fillna juga mengembalikan object baru, jadi simpan hasilnya.