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 TLsiparis_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: object300 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ı: 4siparisler['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ı
| Terim | Anlamı |
|---|---|
| İ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ı |
dtype | Bir 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.
Kod
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:
- DataFrame’i “büyük bir NumPy dizisi” sanıp sütun bazlı farklı dtype’ları göz ardı etmek.
- İ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.
siparisler['tutar']ilesiparisler[['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?
- Series sadece sayı tutabilir
- Series, her değere bir etiket (indeks) ekler (doğru cevap)
- İkisi arasında hiçbir fark yoktur
- 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?
- Tüm sütunlar aynı dtype'a sahip olmak zorundadır
- Her sütun kendi dtype'ını taşıyabilir ve aslında bir Series'tir (doğru cevap)
- Sütunlar sadece sayısal veri içerebilir
- 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?
- NumPy dizisi
- Python listesi
- pandas Series (doğru cevap)
- 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).