Ana içeriğe geç

Giriş12 dk

pandas: Series ve DataFrame

Önkoşul:Vektörleştirme: döngüyü bırakmak

Kanca

5 siparişin tutarını bir NumPy dizisinde tutuyorsun: [149.90, 89.50, 320.00, 45.00, 210.75]. Ama “S1003 numaralı siparişin tutarı kaç?” diye sorulunca, hangi indeksin hangi siparişe ait olduğunu ezbere mi tutacaksın? pandas’ın Series’i, tam olarak bu sorunu çözmek için var.

Sezgi

NumPy dizisi, verinin değerlerini tutar ama kimliğini unutur — 3. eleman “3. eleman”dır, başka bir şey değil. pandas Series, aynı NumPy dizisinin üzerine bir ETİKET (indeks) ekler — artık her değerin bir adı var. DataFrame ise, birden fazla Series’in aynı etiketler etrafında yan yana durduğu bir tablodur — tıpkı bir Excel sayfası gibi, ama Python içinde, programatik olarak.

Series = etiketli tek sütun. DataFrame = etiketli birden çok sütun, hepsi aynı satır kimliğini paylaşır.

Mekanizma

Önce bir Series kuralım — sipariş numaralarını indeks olarak kullanacağız:

pandas Series

# Series: ETİKETLİ, tek boyutlu bir dizi. NumPy dizisinden farkı: her elemanın bir "adı" (indeksi) var.
siparis_tutarlari = pd.Series(
    [149.90, 89.50, 320.00, 45.00, 210.75],
    index=["S1001", "S1002", "S1003", "S1004", "S1005"],
    name="tutar",
)
print(siparis_tutarlari)
print(f"\nS1003 numaralı siparişin tutarı: {siparis_tutarlari['S1003']} TL")
print(f"Ortalama tutar: {siparis_tutarlari.mean():.2f} TL")
S1001    149.90
S1002     89.50
S1003    320.00
S1004     45.00
S1005    210.75
Name: tutar, dtype: float64

S1003 numaralı siparişin tutarı: 320.0 TL
Ortalama tutar: 163.03 TL

siparis_tutarlari['S1003'] yazarak doğrudan sipariş numarasıyla erişebiliyoruz — NumPy dizisinde bunu yapamazdık, sadece dizi[2] diyebilirdik. Şimdi bir DataFrame kuralım — gerçekçi bir e-ticaret sipariş verisi:

pandas DataFrame

# DataFrame: birden çok Series'in yan yana durduğu, ETİKETLİ bir tablo.
n = 300
siparisler = pd.DataFrame({
    "musteri_id": rng.integers(1000, 1100, size=n),
    "kategori": rng.choice(["Elektronik", "Giyim", "Ev & Yaşam", "Kitap"], size=n, p=[0.3, 0.35, 0.2, 0.15]),
    "tutar": rng.gamma(shape=2, scale=80, size=n).round(2),
    "bolge": rng.choice(["Marmara", "Ege", "İç Anadolu", "Akdeniz"], size=n),
})

print(f"\nDataFrame şekli: {siparisler.shape}  (satır, sütun)")
print(siparisler.head())
print(f"\nSütun tipleri:\n{siparisler.dtypes}")

DataFrame şekli: (300, 4)  (satır, sütun)
   musteri_id    kategori   tutar       bolge
0        1008  Ev & Yaşam  188.61         Ege
1        1077       Kitap   19.54         Ege
2        1065  Elektronik   80.10     Akdeniz
3        1043       Giyim   50.56  İç Anadolu
4        1043  Elektronik  182.59  İç Anadolu

Sütun tipleri:
musteri_id      int64
kategori          str
tutar         float64
bolge             str
dtype: object

300 satır, 4 sütun. dtypes çıktısına dikkat et: musteri_id tam sayı, tutar ondalık sayı, kategori ve bolge ise str — pandas 3’te metin sütunları artık kendi özel str tipini kullanıyor (eski pandas sürümlerinde bunun yerine genel amaçlı object yazardı).

Çoğu kişi DataFrame’i “sayı tablosu” olarak düşünür ve sütunların birer Series olduğunu unutur. Değil, çünkü bir DataFrame’in her sütunu bağımsız bir Series’tir — bunu doğrulayalım:

DataFrame'in her sütunu bir Series'tir

# Bir DataFrame'in HER SÜTUNU aslında bir Series'tir.
tutar_sutunu = siparisler["tutar"]
print(f"\nsiparisler['tutar'] tipi: {type(tutar_sutunu).__name__}")
print(f"İlk 5 değer:\n{tutar_sutunu.head()}")

print(f"\nToplam ciro: {siparisler['tutar'].sum():.2f} TL")
print(f"Kategori sayısı: {siparisler['kategori'].nunique()}")

siparisler['tutar'] tipi: Series
İlk 5 değer:
0    188.61
1     19.54
2     80.10
3     50.56
4    182.59
Name: tutar, dtype: float64

Toplam ciro: 46161.29 TL
Kategori sayısı: 4

siparisler['tutar'] çağrısı bize gerçek bir Series nesnesi döndürüyor — üzerinde .mean(), .sum() gibi Series metotlarını doğrudan kullanabiliyoruz.

Matematik

Series ve DataFrame'in yapısı
Series={(etiketi,deg˘eri)}i=1n\text{Series} = \{(\text{etiket}_i, \text{değer}_i)\}_{i=1}^{n}DataFrame={Series1,Series2,,Seriesm} (ortak etiketlerle)\text{DataFrame} = \{\text{Series}_1, \text{Series}_2, \ldots, \text{Series}_m\} \text{ (ortak etiketlerle)}
TerimAnlamı
İndeks (index)Satırları tanımlayan etiket dizisi — varsayılan olarak 0,1,2,… ama istediğin gibi (sipariş no, tarih) ayarlanabilir
Sütun (columns)DataFrame’deki her Series’in adı
dtypeBir Series’teki tüm değerlerin ortak veri tipi — NumPy’daki gibi

DataFrame’i “satır×sütun’luk bir NumPy dizisi” gibi düşünmek yaklaşık doğrudur, ama fark şurada: NumPy dizisinde tüm hücreler aynı dtype’a sahip olmak zorundadır, DataFrame’de ise her sütun kendi dtype’ını taşıyabilir — bir sütun tam sayı, bir diğeri metin, bir diğeri tarih olabilir.

Matematik tazelemeMatris nedir

Kod

300 siparişin kategoriye göre dağılımını gösteren çubuk grafik — Giyim ve Elektronik en yüksek, Kitap en düşük.
value_counts(), bir Series'teki her benzersiz değerin kaç kez geçtiğini sayan en sık kullanılan pandas metotlarından biri.

Nerede işe yarar

Series ve DataFrame, pandas’ın (dolayısıyla Python’da veri analizinin) temel yapı taşlarıdır:

  • Gerçek dünya verisi. CSV, Excel, veritabanı sorgusu — hepsi pandas’a DataFrame olarak yüklenir.
  • Zaman serisi analizi. Tarih indeksli bir Series, borsa verisi veya sensör okumaları gibi zaman serilerini doğal olarak temsil eder.
  • Rapor ve özetler. .describe(), .value_counts(), .groupby() (8. derste) gibi metotlar doğrudan Series/DataFrame üzerinde çalışır.

Bu 3 hatayı yaparsın:

  1. DataFrame’i “büyük bir NumPy dizisi” sanıp sütun bazlı farklı dtype’ları göz ardı etmek.
  2. İndeksin sadece “satır numarası” olduğunu sanmak — aslında herhangi bir etiket (tarih, kimlik numarası) olabilir ve erişimi bu etikete göre yapılır.
  3. siparisler['tutar'] ile siparisler[['tutar']] arasındaki farkı karıştırmak — ilki bir Series, ikincisi (çift köşeli parantez) tek sütunlu bir DataFrame döndürür.

Kendini test et

1. Bir pandas Series, bir NumPy dizisinden temel olarak nasıl farklıdır?
  1. Series sadece sayı tutabilir
  2. Series, her değere bir etiket (indeks) ekler (doğru cevap)
  3. İkisi arasında hiçbir fark yoktur
  4. Series daha yavaştır, başka farkı yoktur

Neden: NumPy dizisi sadece pozisyonla erişilebilir; Series aynı veriye anlamlı bir etiket (örn. sipariş numarası) ekler, bu etiketle erişim sağlar.

2. Bir DataFrame'in sütunları için hangisi doğrudur?
  1. Tüm sütunlar aynı dtype'a sahip olmak zorundadır
  2. Her sütun kendi dtype'ını taşıyabilir ve aslında bir Series'tir (doğru cevap)
  3. Sütunlar sadece sayısal veri içerebilir
  4. DataFrame'de sütun kavramı yoktur

Neden: DataFrame'in her sütunu bağımsız bir Series'tir ve kendi dtype'ını taşır — bir sütun tam sayı, bir diğeri metin olabilir.

3. `siparisler["tutar"]` ifadesi hangi tür bir nesne döndürür?
  1. NumPy dizisi
  2. Python listesi
  3. pandas Series (doğru cevap)
  4. pandas DataFrame

Neden: Tek köşeli parantezle tek bir sütun seçmek her zaman bir Series döndürür; çift köşeli parantez [["tutar"]] kullanılsaydı tek sütunlu bir DataFrame dönerdi.

Özet

Özet

  • Series, etiketli (indeksli) tek boyutlu bir veri yapısıdır — NumPy dizisi + anlamlı isimler.
  • DataFrame, ortak bir indeksi paylaşan birden çok Series'in yan yana durduğu bir tablodur.
  • Bir DataFrame'in her sütunu bağımsız bir Series'tir ve kendi dtype'ını taşıyabilir.
  • İndeks, satır numarası olmak zorunda değildir — tarih, kimlik numarası gibi anlamlı bir etiket olabilir.
  • pandas 3'te metin sütunları artık özel bir `str` dtype'ı kullanır (eski sürümlerde `object` idi).
Sonraki adım: Veri okuma ve tip sorunları →