- Series ve DataFrame'in yapısını (değerler, indeks, sütunlar, türler) açıklamak
- Bir CSV okuyup
head,info,describevevalue_countsile veriye ilk bakışı yapmak loc,iloc, maskeler vequeryile 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
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.
İ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:
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).
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().
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.
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
- 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.
price sütununun %25 ve %75 çeyreklerini elle hesapla ve describe() sonucuyla karşılaştır.
Çözümü gösterÇözümü gizle
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ım | Ne 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 |
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.0loc[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.
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.0Yeni 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.
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
Yukarıdaki tabloya göre toplam gelirin yüzde kaçı Electronics kategorisinden geliyor? Elle hesapla ve pandas ifadesini yaz.
Çözümü gösterÇözümü gizle
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.
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.
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
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ı.
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(). locetiketlerle çalışır ve dilimin sonunu dahil eder;ilockonumlarla çalışır ve dahil etmez.- Filtrelemek için maskeler (
&,|,~),isinvequery; sıralamak içinsort_valuesvenlargest. - Bazı satırları değiştirmek için
df.loc[maske, 'sütun'] = değeryaz, zincirleme atamadan kaçın.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
df.loc[2:4] kaç satır döndürür?