Pandas Cheat Sheet (Hile Sayfası)
Son güncelleme
DataFrame oluşturma
Örnekler, testler ve küçük referans tabloları için elle kurulan küçük DataFrame'ler.
| İşlem | Kod |
|---|---|
| pandas ve NumPy'ı içe aktar | import pandas as pd
import numpy as np |
| Sütunlardan oluşan bir dict'ten | df = pd.DataFrame({"name": ["Ada", "Ben"], "age": [36, 28]}) |
| Satır listesinden | pd.DataFrame([{"name": "Ada", "age": 36}, {"name": "Ben", "age": 28}]) |
| NumPy dizisinden | pd.DataFrame(np.arange(6).reshape(3, 2), columns=["x", "y"]) |
| Etiketli bir Series | s = pd.Series([3, 5, 2], index=["a", "b", "c"]) |
| Tarih aralığı | pd.date_range("2026-01-01", periods=7, freq="D") |
Dosya okuma ve yazma
Tek bir çağrı dosyayı DataFrame'e yükler, tek bir çağrı da geri yazar.
| İşlem | Kod |
|---|---|
| CSV dosyası oku | df = pd.read_csv("sales.csv") |
| Yalnızca bazı sütunlar, gerçek tarihlerle | pd.read_csv("sales.csv", usecols=["date", "city", "sales"], parse_dates=["date"]) |
| Bir sütunu indeks yap | pd.read_csv("sales.csv", index_col="id") |
| Sekme ya da başka ayırıcı | pd.read_csv("sales.tsv", sep="\t") |
| Ek işaretleri eksik say | pd.read_csv("sales.csv", na_values=["n/a", "-"]) |
| Yalnızca ilk satırları oku | pd.read_csv("sales.csv", nrows=1000) |
| Excel sayfası oku (openpyxl gerekir) | pd.read_excel("report.xlsx", sheet_name="2026") |
| JSON kayıtlarını oku | pd.read_json("records.json") |
| SQL veritabanından oku | pd.read_sql("SELECT * FROM orders", conn) |
| İndekssiz CSV yaz | df.to_csv("clean.csv", index=False) |
| Excel ya da Parquet yaz | df.to_excel("clean.xlsx", index=False), df.to_parquet("clean.parquet") |
Veriyi incele
Her yeni veri setinde ilk yapacağın çağrılar.
| İşlem | Kod |
|---|---|
| İlk ve son satırlar | df.head(), df.tail(3) |
| Satır ve sütun sayısı | df.shape # (6, 7) |
| Sütun tipleri ve dolu değer sayıları | df.info() |
| Sayısal sütunların özet istatistikleri | df.describe() |
| Tüm sütunların özeti | df.describe(include="all") |
| Sütun adları ve tipleri | df.columns, df.dtypes |
| Her değerin sayısı | df["city"].value_counts() |
| Her değerin oranı | df["city"].value_counts(normalize=True) |
| Benzersiz değerler ve sayısı | df["city"].unique(), df["city"].nunique() |
| Sütun başına eksik değerler | df.isna().sum() |
| Rastgele satır örneği | df.sample(3, random_state=0) |
| Sayısal sütunların korelasyonu | df.corr(numeric_only=True) |
Sütun ve satır seçme
loc etikete göre seçer ve dilimin sonunu dahil eder. iloc konuma göre seçer ve sonu dahil etmez.
| İşlem | Kod |
|---|---|
| Tek sütun, Series olarak | df["age"] |
| Birkaç sütun, DataFrame olarak | df[["name", "age"]] |
| Etikete göre satır ve sütun | df.loc[0:2, ["name", "age"]] |
| Konuma göre satır ve sütun | df.iloc[0:2, 0:3] |
| Tek bir değer | df.at[0, "age"], df.iat[0, 3] |
| Son satır | df.iloc[-1] |
| Belirli tipteki sütunlar | df.select_dtypes(include="number") |
| Metin sütunları (pandas 3) | df.select_dtypes(include="str") |
| Ada göre eşleşen sütunlar | df.filter(like="sal"), df.filter(regex="^(age|salary)$") |
| Satırları bir sütuna göre bul | df.set_index("name").loc["Ada", "salary"] |
| 0, 1, 2 indeksine geri dön | df.reset_index(drop=True) |
| Sütun ya da satır sil | df.drop(columns=["email"]), df.drop(index=[0, 1]) |
Satır filtreleme
Her koşulu paranteze al ve & (ve), | (veya) ve ~ (değil) ile birleştir.
| İşlem | Kod |
|---|---|
| Koşula uyan satırlar | df[df["age"] > 30] |
| İki koşul birden | df[(df["age"] > 30) & (df["city"] == "Oslo")] |
| Koşullardan biri | df[(df["city"] == "Oslo") | (df["salary"] > 6000)] |
| Değer listede | df[df["city"].isin(["Oslo", "Rome"])] |
| Değer listede değil | df[~df["city"].isin(["Oslo", "Rome"])] |
| İki değer arası, uçlar dahil | df[df["age"].between(30, 40)] |
| Sorgu metniyle filtrele | df.query("age > 30 and city == 'Oslo'") |
| Sorguda değişken kullan | min_age = 30
df.query("age > @min_age") |
| Metin içerir | df[df["name"].str.contains("e", case=False)] |
| Eksik ya da dolu değerler | df[df["age"].isna()], df[df["age"].notna()] |
| Satır filtrele, sütun seç | df.loc[df["age"] > 30, ["name", "salary"]] |
| En büyük ya da en küçük n satır | df.nlargest(3, "salary"), df.nsmallest(2, "age") |
| Tekrarlanan değere sahip satırlar | df[df.duplicated(subset=["city"], keep=False)] |
Sıralama ve derecelendirme
| İşlem | Kod |
|---|---|
| Bir sütuna göre sırala | df.sort_values("salary") |
| Büyükten küçüğe | df.sort_values("salary", ascending=False) |
| Birkaç sütuna göre sırala | df.sort_values(["city", "salary"], ascending=[True, False]) |
| Eksik değerler başta | df.sort_values("age", na_position="first") |
| İndekse göre sırala | df.sort_index() |
| Değerleri derecelendir, 1 en yüksek | df["salary"].rank(ascending=False) |
Sütun ekleme ve değiştirme
Tüm sütun üzerinde çalışan işlemler hızlıdır. apply yalnızca hazır bir metot işi görmediğinde kullan.
| İşlem | Kod |
|---|---|
| Diğer sütunlardan yeni sütun | df["bonus"] = df["salary"] * 0.1 |
| Zincir içinde sütun ekle | df.assign(bonus=lambda d: d["salary"] * 0.1) |
| Koşula göre değer | df["level"] = np.where(df["age"] >= 40, "senior", "junior") |
| Birkaç koşula göre değer | df["band"] = np.select([df["age"] < 30, df["age"] < 45], ["young", "mid"], default="senior") |
| Koşul sağlanan yerde değeri değiştir | df.loc[df["city"] == "Lima", "salary"] = 4000 |
| Değerleri dict ile eşle | df["country"] = df["city"].map({"Oslo": "NO", "Rome": "IT", "Lima": "PE"}) |
| Sütuna fonksiyon uygula | df["salary"].apply(lambda x: round(x, -3)) |
| Her hücreye fonksiyon uygula | df[["age", "salary"]].map(lambda x: x / 1000) |
| Sütunları yeniden adlandır | df.rename(columns={"salary": "pay"}) |
| Sütun tipini değiştir | df["salary"].astype("float64") |
| Metni sayıya çevir, hatalılar NaN olsun | pd.to_numeric(s, errors="coerce") |
| Sayıları etiketli aralıklara böl | pd.cut(df["age"], bins=[0, 30, 45, 120], labels=["young", "mid", "senior"]) |
| Sayıları eşit büyüklükte gruplara böl | pd.qcut(df["salary"], q=4, labels=False) |
| Satırlar üzerinde döngü (yavaş, son çare) | for row in df.itertuples():
print(row.name, row.salary) |
Eksik değerler ve temizlik
Eksik sayılar NaN, eksik tarihler NaT olarak görünür. Bu çağrıların her biri yeni bir nesne döndürür, bu yüzden sonucu bir değişkene ata.
| İşlem | Kod |
|---|---|
| Sütun başına eksik değer oranı | df.isna().mean() |
| Eksik değeri olan satırları sil | df.dropna() |
| Anahtar sütunu boş satırları sil | df.dropna(subset=["age"]) |
| Sütun başına bir değerle doldur | df.fillna({"age": df["age"].median()}) |
| Önceki ya da sonraki satırdan doldur | df["age"].ffill(), df["age"].bfill() |
| Boşlukları interpolasyonla doldur | df["age"].interpolate() |
| İşaretleri eksik değere çevir | df.replace(["n/a", "-", ""], np.nan) |
| Tekrarlanan satırları sil | df.drop_duplicates() |
| Her anahtar için son satırı tut | df.drop_duplicates(subset=["city"], keep="last") |
| Sütun adlarını düzenle | df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_") |
| Uç değerleri sınırla | df["salary"].clip(lower=4000, upper=6000) |
| Tekrarlanan metin için category tipi | df["city"] = df["city"].astype("category") |
Metin sütunları (.str)
pandas 3'te metin sütunları varsayılan olarak str dtype'ını alır. .str metotları tüm sütun üzerinde çalışır ve eksik değerler eksik kalır.
| İşlem | Kod |
|---|---|
| Büyük, küçük ya da baş harfi büyük | df["name"].str.upper(), df["name"].str.lower(), df["name"].str.title() |
| Boşlukları kırp | df["name"].str.strip() |
| Metni değiştir | df["email"].str.replace("mail.com", "example.com") |
| Regex ile değiştir | df["email"].str.replace(r"@.*", "", regex=True) |
| İçerir, ile başlar | df["name"].str.contains("a"), df["name"].str.startswith("E") |
| Her değerin uzunluğu | df["name"].str.len() |
| İlk karakterler | df["name"].str[:2] |
| Sütunlara böl | df["email"].str.split("@", expand=True) |
| Regex grubuyla çıkar | df["email"].str.extract(r"@(\w+)") |
| Metin sütunlarını birleştir | df["name"] + " (" + df["city"] + ")" |
| Sayıları sıfırla doldur | df["salary"].astype("str").str.zfill(6) |
| Yeni metin dtype'ı | df["name"].dtype # str |
Tarih ve saat
.dt erişimcisi datetime sütunlarında çalışır. Sıralı bir tarih indeksi (aşağıdaki ts) metinle dilimlemeyi ve yeniden örneklemeyi mümkün kılar.
| İşlem | Kod |
|---|---|
| Sütunu datetime'a çevir | df["date"] = pd.to_datetime(df["date"]) |
| Kesin formatla çevir | pd.to_datetime(["03/01/2026", "15/01/2026"], format="%d/%m/%Y") |
| Yıl, ay, gün adı | df["date"].dt.year, df["date"].dt.month, df["date"].dt.day_name() |
| Tarihleri aya göre grupla | df["date"].dt.to_period("M") |
| İki tarih arasındaki gün | (pd.Timestamp("2026-12-31") - df["date"]).dt.days |
| Gün ya da ay ekle | df["date"] + pd.Timedelta(days=30), df["date"] + pd.DateOffset(months=1) |
| Tarih aralığındaki satırlar | df[df["date"].between("2021-01-01", "2022-12-31")] |
| Tarih indeksi, metinle dilimleme | ts = df.set_index("date").sort_index()
ts.loc["2021":"2022"] |
| Aylık toplam | ts["salary"].resample("ME").sum() |
Haftalık ortalama; "QE" çeyreklik, "YE" yıllık | ts["salary"].resample("W").mean() |
| Hareketli ortalama | ts["salary"].rolling(3).mean() |
| Önceki satıra göre değişim | ts["salary"].diff(), ts["salary"].pct_change() |
| Değerleri bir satır aşağı kaydır | ts["salary"].shift(1) |
| Kümülatif toplam | ts["salary"].cumsum() |
| Saat dilimi ata ve dönüştür | ts.index.tz_localize("UTC").tz_convert("Europe/Oslo") |
Gruplama ve toplama
groupby satırları anahtara göre ayırır, her gruba bir fonksiyon uygular ve sonuçları birleştirir.
| İşlem | Kod |
|---|---|
| Grup başına ortalama | df.groupby("city")["salary"].mean() |
| Aynı anda birkaç istatistik | df.groupby("city")["salary"].agg(["mean", "max", "count"]) |
| Adlandırılmış sonuç sütunları | df.groupby("city").agg(avg_pay=("salary", "mean"), people=("name", "count")) |
| İki sütuna göre grupla | df.groupby(["city", "team"])["salary"].sum() |
| Anahtarları sütun olarak tut | df.groupby("city", as_index=False)["salary"].mean() |
| Grup başına satır sayısı | df.groupby("city").size() |
| Grup sonucunu her satıra yaz | df["city_avg"] = df.groupby("city")["salary"].transform("mean") |
| Yalnızca bazı grupları tut | df.groupby("city").filter(lambda g: len(g) >= 2) |
| Her grupta en büyük değerli satır | df.loc[df.groupby("city")["salary"].idxmax()] |
| Her grupta ilk n satır | df.sort_values("salary", ascending=False).groupby("city").head(2) |
| Her grupta satırları numarala | df.groupby("city").cumcount() |
| Gruplar üzerinde döngü | for city, group in df.groupby("city"):
print(city, len(group)) |
| Tek zincirde filtrele, grupla, sırala | (df.query("age > 30")
.groupby("city", as_index=False)
.agg(avg_pay=("salary", "mean"))
.sort_values("avg_pay", ascending=False)) |
Pivot ve yeniden şekillendirme
Uzun veride her gözlem bir satırdır. Geniş veri ise bir değişkeni sütunlara yayar.
| İşlem | Kod |
|---|---|
| Pivot tablo | df.pivot_table(index="city", columns="team", values="salary", aggfunc="mean", fill_value=0) |
| Toplamlı pivot tablo | df.pivot_table(index="city", values="salary", aggfunc="sum", margins=True) |
| Kombinasyonları say | pd.crosstab(df["city"], df["team"]) |
| Satır başına oranlar | pd.crosstab(df["city"], df["team"], normalize="index") |
| Genişten uzuna | long = df.melt(id_vars="name", value_vars=["age", "salary"], var_name="field", value_name="value") |
| Uzundan genişe | long.pivot(index="name", columns="field", values="value") |
| İç indeks seviyesini sütunlara taşı | df.groupby(["city", "team"])["salary"].sum().unstack(fill_value=0) |
| Liste elemanı başına bir satır | pd.DataFrame({"id": [1, 2], "tags": [["a", "b"], ["c"]]}).explode("tags") |
| Sütunu one-hot encode et | pd.get_dummies(df["team"], prefix="team") |
| Satır ve sütunların yerini değiştir | df.T |
DataFrame birleştirme
concat tabloları üst üste ya da yan yana ekler, merge ise onları SQL'deki gibi anahtar sütunlar üzerinden join eder.
| İşlem | Kod |
|---|---|
| Satırları alt alta ekle | pd.concat([df_2025, df_2026], ignore_index=True) |
| Yan yana koy | pd.concat([left, right], axis=1) |
| Anahtar sütunla join | orders.merge(customers, on="customer_id", how="left") |
| Join türleri | how="inner", "left", "right", "outer" |
| Farklı adlı anahtarlar | orders.merge(users, left_on="customer_id", right_on="id") |
| Join'i doğrula, her satırın kaynağını işaretle | orders.merge(customers, on="customer_id", how="left", validate="many_to_one", indicator=True) |
| İndeks üzerinden join | left.join(right, how="inner") |
| Diğer tabloda eşi olmayan satırlar | orders[~orders["customer_id"].isin(customers["customer_id"])] |
pandas ile grafik
pandas çizimi Matplotlib ile yapar. Her grafik çağrısı bir Matplotlib ax nesnesi döndürür, böylece biçimlendirmeye devam edebilirsin.
| İşlem | Kod |
|---|---|
| Series'in çizgi grafiği | ts["salary"].plot() |
| İki sütundan çizgi grafiği | df.plot(x="date", y="salary") |
| Özetin çubuk grafiği | df.groupby("city")["salary"].mean().plot.bar() |
| Sıralı yatay çubuklar | df["city"].value_counts().sort_values().plot.barh() |
| Histogram | df["salary"].plot.hist(bins=20) |
| Dağılım grafiği | df.plot.scatter(x="age", y="salary") |
| Grup başına kutu grafiği | df.boxplot(column="salary", by="city") |
| Başlık ve eksen etiketi | ax = df.plot(x="date", y="salary", title="Salary")
ax.set_ylabel("EUR") |
| Grafiği göster ya da kaydet | plt.show(), ax.figure.savefig("salary.png", dpi=150) |
pandas 3: eski kullanımlar ve yerine yazman gerekenler
Eski eğitimlerden kopyalanan kod pandas 3'te sıkça hata ya da uyarı verir. Onun yerine pandas 3 sütunundaki kullanımları yaz.
| İşlem | pandas 3 | Eski kullanım |
|---|---|---|
| Her hücreye fonksiyon | df.map(f) | df.applymap(f) |
| Önceki satırdan doldur | df.ffill() | df.fillna(method="ffill") |
| Satır ekle | pd.concat([df, new_rows]) | df.append(new_rows) |
| Ay sonuna göre yeniden örnekleme | ts["salary"].resample("ME").sum() | resample("M") |
| Saatlik tarihler | pd.date_range("2026-01-01", periods=24, freq="h") | freq="H" |
| Tek bir değer ata | df.loc[0, "age"] = 37 | df["age"][0] = 37 |
| Filtrelenmiş alt kümeyi değiştir | high = df[df["salary"] > 5000]
high["salary"] = 0 | high = df[df["salary"] > 5000].copy() |
| Bu bir metin sütunu mu? | df["name"].dtype == "str" | df["name"].dtype == object |
Bir veri analistinin her gün başvurduğu pandas kodları, işe göre gruplanmış hâlde: veri oluşturma ve yükleme, veriyi inceleme, satır seçme ve filtreleme, sütun ekleme, eksik değerleri temizleme, metin ve tarihlerle çalışma, gruplama ve toplama, yeniden şekillendirme, birleştirme ve grafik çizme. Her satırda yapıştırabileceğin kısa bir kod parçası ve ne yaptığını anlatan tek bir cümle var.
Buradaki her şey Coddy'nin kullandığı sürüm olan pandas 3 için yazıldı: metin sütunları yeni str dtype'ını kullanır, Copy-on-Write her zaman açıktır, applymap ve fillna(method=...) gibi kaldırılan API'ler yalnızca eski kullanımlar tablosunda yer alır. Örnekler name, city, team, age, salary, date ve email sütunlarına sahip bir df DataFrame'i kullanır. Python'a yeni mi başlıyorsun? Önce Python hile sayfası ve Python playground ile başla, NumPy, Matplotlib ve scikit-learn hile sayfalarını da bunun yanında açık tut.
pandas hile sayfası hakkında sık sorulan sorular
Bu pandas hile sayfası ücretsiz mi?
Bu hile sayfası hangi pandas sürümünü kapsıyor?
str dtype'ını kullanır, Copy-on-Write her zaman açıktır ve pandas 3'te kaldırılan çağrılar (applymap, fillna(method=...), append, M ve H frekans takma adları) yalnızca son tabloda, yerine yazman gerekenlerin yanında yer alır. str dtype'ına ya da Copy-on-Write'a dayanan satırlar dışında neredeyse her kod parçası pandas 2.2'de de çalışır.loc ile iloc arasındaki fark nedir?
loc etikete, yani indeks değerlerine ve sütun adlarına göre seçer; df.loc[0:2] gibi bir dilim sonunu da dahil eder. iloc ise bir Python listesi gibi tam sayı konumuna göre seçer, bu yüzden df.iloc[0:2] ilk iki satırı döndürür ve sonu dahil etmez. Satırları filtreleyip sütunları tek adımda seçmek için loc ile bir koşul kullan: df.loc[df["age"] > 30, ["name"]].Bir DataFrame'i birkaç koşula göre nasıl filtrelerim?
&, veya için |, değil için ~ ile birleştir: df[(df["age"] > 30) & (df["city"] == "Oslo")]. Python'un and ve or operatörleri tüm sütunlar üzerinde çalışmaz. Uzun filtrelerde df.query("age > 30 and city == 'Oslo'") daha kolay okunur.merge, join ve concat arasındaki fark nedir?
merge iki DataFrame'i bir SQL join gibi anahtar sütunlar üzerinden birleştirir; how="inner", "left", "right" ya da "outer" seçeneklerini alır. join indeks üzerinden merge yapan bir kısayoldur. concat ise anahtar eşleştirmez: tabloları üst üste ya da axis=1 ile yan yana ekler.Atamam neden DataFrame'i değiştirmiyor?
df["age"][0] = 37 gibi zincirleme atama geçici bir nesneyi değiştirir ve df olduğu gibi kalır. Bunun yerine tek bir loc çağrısıyla yaz: df.loc[0, "age"] = 37. dropna ve fillna gibi metotlar da yeni bir nesne döndürür, bu yüzden sonucu bir değişkene ata.