İçeriğe geç
Educora
Üniversite25 dk31 / 42

pandas'ın temelleri: Series ve DataFrame

pandas ile tablo verisiyle çalış: Series ve DataFrame, CSV okuma, `head`, `info`, `describe`, `loc` ve `iloc` ile seçim, filtreleme, sıralama ve yeni sütunlar.

Kendini test et
Bu derste öğreneceklerin
  • Series ve DataFrame'in yapısını (değerler, indeks, sütunlar, türler) açıklamak
  • Bir CSV okuyup head, info, describe ve value_counts ile veriye ilk bakışı yapmak
  • loc, iloc, maskeler ve query ile satır ve sütun seçmek, sıralamak
  • Yeni sütunları vektörleştirilmiş biçimde ve zincirleme atama hatası olmadan oluşturmak

Aysel küçük bir çevrim içi kırtasiye mağazası işletiyor. Satışları bir Excel tablosunda: ürün, kategori, fiyat, stok ve satılan adet. Yüzlerce satırda “hangi kategori daha çok gelir getiriyor?” ya da “neyi yeniden sipariş etmek gerekiyor?” sorularını yanıtlamak için pandas kütüphanesi vardır. NumPy dizilerinin üzerine sütun adları, satır etiketleri ve tablolar için yüzlerce hazır işlem ekler.

Series ve DataFrame

Tanım
Series

Etiketli tek boyutlu bir dizi: değerler (bir NumPy dizisi) ve onlara karşılık gelen indeks (etiketler). Bir adı (name) ve türü (dtype) vardır.

Tanım
DataFrame

İki boyutlu bir tablo: ortak bir indeksi paylaşan Series'lerin (sütunların) topluluğu. Her sütunun kendi türü olabilir: metin, tam sayı, ondalıklı sayı, tarih.

Series'te bir elemana hem etiketle (s['Pen']) hem de konumla (s.iloc[0]) erişebilirsin. Aritmetik işlemler NumPy'daki gibi vektörleştirilmiştir. Aşağıda fiyatlara %18 KDV ekliyoruz:

Python
import pandas as pd

prices = pd.Series([1.5, 0.6, 35.0, 49.9],
                   index=['Notebook', 'Pen', 'Backpack', 'Headphones'],
                   name='price')
print(prices)
print(prices['Pen'], prices.iloc[-1])
print(prices[prices > 10].index.tolist())
print((prices * 1.18).round(2).tolist())
▸ Beklenen çıktı
Notebook       1.5
Pen            0.6
Backpack      35.0
Headphones    49.9
Name: price, dtype: float64
0.6 49.9
['Backpack', 'Headphones']
[1.77, 0.71, 41.3, 58.88]

DataFrame oluşturmanın en basit yolu bir sözlüktür: anahtarlar sütun adları, değerler sütunların içeriğidir. shape (satır, sütun) demetidir, dtypes ise her sütunun türünü gösterir. pandas 3'te metin sütunlarının türü str'dir (eski sürümlerde object görürsün).

Python
import pandas as pd

df = pd.DataFrame({
    'name': ['Aysel', 'Murad', 'Leyla'],
    'age': [19, 21, 20],
    'city': ['Baku', 'Ganja', 'Baku'],
})
print(df)
print(df.shape, df.columns.tolist())
print(df.dtypes)
▸ Beklenen çıktı
    name  age   city
0  Aysel   19   Baku
1  Murad   21  Ganja
2  Leyla   20   Baku
(3, 3) ['name', 'age', 'city']
name      str
age     int64
city      str
dtype: object

CSV okumak ve veriye ilk bakış

Gerçek işte tablo bir dosyadan okunur: pd.read_csv('sales.csv'). Tarayıcıda dosya olmadığı için metni io.StringIO ile bir “dosyaya” çeviriyoruz; read_csv için fark yoktur. Her kod bloğu ayrı çalıştığından tabloyu her blokta yeniden oluşturuyoruz. İlk adım hep aynıdır: head() ilk satırları, info() ise sütunları, türlerini ve boş olmayan değer sayısını gösterir. Aşağıda aynı bilgileri parça parça yazdırıyoruz: shape, dtypes ve count().

Python
import io
import pandas as pd

data = '''product,category,price,stock,sold
Notebook,Stationery,1.5,120,340
Pen,Stationery,0.6,300,820
Backpack,Accessories,35.0,25,48
Headphones,Electronics,49.9,15,37
USB cable,Electronics,6.5,80,150
Mug,Home,8.0,40,95
Desk lamp,Home,27.5,12,20'''
df = pd.read_csv(io.StringIO(data))
print(df.head(3))
print(df.shape)
print(df.dtypes)
print(df.count().tolist())
▸ Beklenen çıktı
    product     category  price  stock  sold
0  Notebook   Stationery    1.5    120   340
1       Pen   Stationery    0.6    300   820
2  Backpack  Accessories   35.0     25    48
(7, 5)
product         str
category        str
price       float64
stock         int64
sold          int64
dtype: object
[7, 7, 7, 7, 7]
read_csv türleri kendisi belirledi: sayılar int64 ve float64, metin str oldu. count() her sütundaki boş olmayan değerleri sayar; burada boşluk yok.

describe() her sayısal sütun için sayı, ortalama, standart sapma (n − 1'e bölerek), minimum, çeyrekler ve maksimumu tek bir tabloda verir. Kategorik bir sütun için ise value_counts() her değerin kaç kez geçtiğini sayar.

Python
import io
import pandas as pd

data = '''product,category,price,stock,sold
Notebook,Stationery,1.5,120,340
Pen,Stationery,0.6,300,820
Backpack,Accessories,35.0,25,48
Headphones,Electronics,49.9,15,37
USB cable,Electronics,6.5,80,150
Mug,Home,8.0,40,95
Desk lamp,Home,27.5,12,20'''
df = pd.read_csv(io.StringIO(data))
print(df.describe().round(2))
print(df['category'].value_counts())
▸ Beklenen çıktı
       price   stock    sold
count   7.00    7.00    7.00
mean   18.43   84.57  215.71
std    19.16  102.74  288.06
min     0.60   12.00   20.00
25%     4.00   20.00   42.50
50%     8.00   40.00   95.00
75%    31.25  100.00  245.00
max    49.90  300.00  820.00
category
Stationery     2
Electronics    2
Home           2
Accessories    1
Name: count, dtype: int64
h = (n − 1) · q Q(q) = x₍ₖ₎ + (h − k) · (x₍ₖ₊₁₎ − x₍ₖ₎), k = ⌊h⌋
burada:
  • qdüzey: 0,25 (birinci çeyrek), 0,5 (medyan), 0,75 (üçüncü çeyrek)
  • x₍ₖ₎artan sırada dizildikten sonraki k. değer (0'dan sayarak)
  • hsıralanmış verideki “kesirli konum”

pandas ve NumPy varsayılan olarak nicelikleri iki komşu değer arasında doğrusal enterpolasyonla hesaplar.

Örnek 1: describe'daki çeyrekleri kontrol edelim

price sütununun %25 ve %75 çeyreklerini elle hesapla ve describe() sonucuyla karşılaştır.

Çözümü göster
Sıralanmış fiyatlar: 0,6; 1,5; 6,5; 8,0; 27,5; 35,0; 49,9 (n = 7).
q = 0,25: h = 6 · 0,25 = 1,5 → x₍₁₎ = 1,5 ile x₍₂₎ = 6,5 arasının ortası: 1,5 + 0,5 · 5 = 4,0.
q = 0,75: h = 6 · 0,75 = 4,5 → 27,5 + 0,5 · 7,5 = 31,25.
Medyan: h = 3 → x₍₃₎ = 8,0. Üçü de describe() ile örtüşüyor. Ortalama (18,43) medyandan çok büyük; birkaç pahalı ürün ortalamayı yukarı çekiyor.

Seçim: sütunlar, loc ve iloc

YazımNe döndürür
df['price']tek bir sütun: Series
df[['product', 'price']]birkaç sütun: DataFrame
df.loc[row_labels, col_labels]etiketlerle seçim; dilimdeki son etiket dahildir
df.iloc[row_pos, col_pos]konumlarla seçim; dilimin sonu dahil değildir
Python
import io
import pandas as pd

data = '''product,category,price,stock,sold
Notebook,Stationery,1.5,120,340
Pen,Stationery,0.6,300,820
Backpack,Accessories,35.0,25,48
Headphones,Electronics,49.9,15,37
USB cable,Electronics,6.5,80,150
Mug,Home,8.0,40,95
Desk lamp,Home,27.5,12,20'''
df = pd.read_csv(io.StringIO(data))
print(df['price'].head(3).tolist())
print(df.loc[2, 'product'], '|', df.iloc[0, 2])
print(df.loc[1:3, 'product':'price'])
print(df.iloc[1:3, 0:2])
df = df.set_index('product')
print(df.loc['Mug', 'price'])
▸ Beklenen çıktı
[1.5, 0.6, 35.0]
Backpack | 1.5
      product     category  price
1         Pen   Stationery    0.6
2    Backpack  Accessories   35.0
3  Headphones  Electronics   49.9
    product     category
1       Pen   Stationery
2  Backpack  Accessories
8.0
loc[1:3] üç satır (1, 2, 3), iloc[1:3] ise iki satır (1, 2) döndürdü. set_index('product') sonrasında satırlara ürün adıyla erişilebilir.

Filtreleme ve sıralama

Satırları NumPy'daki gibi mantıksal maskelerle filtreleriz: koşulları &, |, ~ ile birleştirip paranteze alırız. isin bir değerin listede olup olmadığını kontrol eder, query ise koşulu metin olarak yazmaya izin verir. sort_values bir sütuna göre sıralar, nlargest ise en büyük n değeri doğrudan döndürür.

Python
import io
import pandas as pd

data = '''product,category,price,stock,sold
Notebook,Stationery,1.5,120,340
Pen,Stationery,0.6,300,820
Backpack,Accessories,35.0,25,48
Headphones,Electronics,49.9,15,37
USB cable,Electronics,6.5,80,150
Mug,Home,8.0,40,95
Desk lamp,Home,27.5,12,20'''
df = pd.read_csv(io.StringIO(data))
cheap = df[df['price'] < 10]
print(cheap[['product', 'price']])
print(df[(df['category'] == 'Electronics') & (df['stock'] < 50)]['product'].tolist())
print(df[df['category'].isin(['Home', 'Accessories'])]['product'].tolist())
print(df.query('price > 20 and sold > 30')[['product', 'sold']])
print(df.sort_values('sold', ascending=False).head(3)[['product', 'sold']])
print(df.nlargest(2, 'price')[['product', 'price']])
▸ Beklenen çıktı
     product  price
0   Notebook    1.5
1        Pen    0.6
4  USB cable    6.5
5        Mug    8.0
['Headphones']
['Backpack', 'Mug', 'Desk lamp']
      product  sold
2    Backpack    48
3  Headphones    37
     product  sold
1        Pen   820
0   Notebook   340
4  USB cable   150
      product  price
3  Headphones   49.9
2    Backpack   35.0

Yeni sütunlar

Yeni bir sütun atamayla oluşur: df['revenue'] = df['price'] * df['sold']; döngü yok, hesap sütunun tamamında yapılır. Koşullu bir değer için np.where, yalnızca bazı satırları değiştirmek için df.loc[maske, 'sütun'] = değer kullanılır. rename ve drop yeni bir DataFrame döndürür; bu yüzden sonucu değişkene yeniden atarız.

Python
import io
import numpy as np
import pandas as pd

data = '''product,category,price,stock,sold
Notebook,Stationery,1.5,120,340
Pen,Stationery,0.6,300,820
Backpack,Accessories,35.0,25,48
Headphones,Electronics,49.9,15,37
USB cable,Electronics,6.5,80,150
Mug,Home,8.0,40,95
Desk lamp,Home,27.5,12,20'''
df = pd.read_csv(io.StringIO(data))
df['revenue'] = (df['price'] * df['sold']).round(2)
df['band'] = np.where(df['price'] >= 20, 'high', 'low')
df['status'] = 'ok'
df.loc[df['stock'] < 20, 'status'] = 'reorder'
df = df.rename(columns={'sold': 'units'}).drop(columns=['category'])
print(df)
print(f"Total revenue: {df['revenue'].sum():.2f} AZN")
▸ Beklenen çıktı
      product  price  stock  units  revenue  band   status
0    Notebook    1.5    120    340    510.0   low       ok
1         Pen    0.6    300    820    492.0   low       ok
2    Backpack   35.0     25     48   1680.0  high       ok
3  Headphones   49.9     15     37   1846.3  high  reorder
4   USB cable    6.5     80    150    975.0   low       ok
5         Mug    8.0     40     95    760.0   low       ok
6   Desk lamp   27.5     12     20    550.0  high  reorder
Total revenue: 6813.30 AZN
Örnek 2: Elektroniğin gelirdeki payı

Yukarıdaki tabloya göre toplam gelirin yüzde kaçı Electronics kategorisinden geliyor? Elle hesapla ve pandas ifadesini yaz.

Çözümü göster
Electronics: Headphones 49,9 · 37 = 1846,3 ve USB cable 6,5 · 150 = 975,0; toplam 2821,3 manat.
Toplam gelir 6813,3 manattır.
Pay = 2821,3 / 6813,3 ≈ 0,414, yani yaklaşık %41,4.
pandas: df.loc[df['category'] == 'Electronics', 'revenue'].sum() / df['revenue'].sum() (bunu drop'tan önce, category sütunu hâlâ varken hesapla).

pandas; analistlerin, ekonomistlerin, bankaların, telekom şirketlerinin ve araştırma laboratuvarlarının günlük aracıdır: raporlar, satış analizi, anket sonuçları, sensör kayıtları. Bir sonraki derste eksik değerler, gruplama, tabloları birleştirme ve tarihlerle çalışacağız.

Alıştırma

CSV'yi bir DataFrame'e oku. 1) Puanı 80 ve üzeri olan öğrencilerin adlarını puana göre azalan sırada liste olarak yazdır; 2) tüm öğrencilerin ortalama puanını 1 ondalık basamağa yuvarlayarak yazdır.

Alıştırma · Python
import io
import pandas as pd

data = '''name,group,score
Aysel,A,91
Murad,B,76
Leyla,A,85
Elvin,B,64
Nigar,A,78
Tural,B,88'''
df = pd.read_csv(io.StringIO(data))
# 1) names with score >= 80, highest first
# 2) mean score, 1 decimal
▸ Beklenen çıktı
['Aysel', 'Tural', 'Leyla']
80.3
Alıştırma

Kafenin sipariş tablosuna total = price * qty sütununu ekle. Ardından ayrı satırlarda yazdır: 1) total değeri en büyük olan ürünün adı; 2) total değeri 25'ten büyük olan ürünlerin listesi; 3) tüm total değerlerinin toplamı.

Alıştırma · Python
import pandas as pd

orders = pd.DataFrame({
    'item': ['tea', 'coffee', 'cake', 'juice'],
    'price': [2.5, 4.0, 5.5, 3.0],
    'qty': [12, 7, 4, 9],
})
# add the total column, then print the three results
▸ Beklenen çıktı
tea
['tea', 'coffee', 'juice']
107.0

Önemli noktalar

  • Series etiketli tek boyutlu bir dizidir; DataFrame ise ortak indeksli Series'lerden oluşan bir tablodur.
  • Yeni veriye ilk bakış: head(), info(), describe(), value_counts().
  • loc etiketlerle çalışır ve dilimin sonunu dahil eder; iloc konumlarla çalışır ve dahil etmez.
  • Filtrelemek için maskeler (&, |, ~), isin ve query; sıralamak için sort_values ve nlargest.
  • Bazı satırları değiştirmek için df.loc[maske, 'sütun'] = değer yaz, zincirleme atamadan kaçın.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
İndeksi 0, 1, 2, … olan bir DataFrame için df.loc[2:4] kaç satır döndürür?