Gruplar İçinde Sıra ve Yüzdelik Dilim
groupby().rank() ile grup içi sıraları hesaplayın ve göreli karşılaştırmalar için pd.qcut ile yüzdelik dilim kutuları oluşturun.
Gruplar İçinde Sıra ve Yüzdelik Dilim, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Pandas & NumPy Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.
Gruplar İçinde Sıralama Neden Yapılır
Ham değerler, çoğu zaman göreli sıralamalardan daha az anlamlıdır. Aylık geliri 50.000 $ olan bir satış temsilcisi, ortalama 30.000 $ ise üst düzey performans gösterir; ancak ortalama 80.000 $ ise düşük performans gösterir. Gruplar içinde sıralama hesaplayarak (ör. her bölge içinde veya her çeyrek içinde sıralama), gruplar arasındaki farklı başlangıç düzeylerini dikkate alan normalleştirilmiş bir karşılaştırma elde edersiniz. Pandas, groupby().rank() ile grup içi sıralamayı kolaylaştırır.
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({
'rep': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve',
'Frank', 'Grace', 'Hank', 'Iris', 'Jake'],
'region': ['East']*5 + ['West']*5,
'sales': np.random.randint(30000, 100000, 10)
})
print(df.sort_values('region'))Series.rank() — Temel Sıralama
Series.rank(), her değere bir sıra atar: 1. sıra en küçük, n. sıra en büyük değerdir. ascending=False parametresi, yönü tersine çevirerek 1. sıranın en büyük değer olmasını sağlar. Bağlı değerler varsayılan olarak bağ sıralamalarının ortalaması alınarak çözümlendiği için sonuç, tam sayı değil, kayan noktalı bir Series olur. 5 değer içeren bir sütunda sıralar 1.0 ile 5.0 arasında değişir — ancak bağlı değerler varsa bazı değerler 2.5 gibi aynı sırayı paylaşabilir.
import pandas as pd
s = pd.Series([80, 45, 90, 45, 70])
print('Values:', s.values)
print('Rank (ascending=True, default):', s.rank().values)
print('Rank (ascending=False — best=1):', s.rank(ascending=False).values)
# Note: two 45s share ranks 1 and 2 → both get 1.5rank() İçinde Bağlı Sıraları Çözümleme Yöntemleri
method parametresi, eşit değerlere ne olacağını belirler. Seçenekler: 'average' (varsayılan — eşit değerler sıralarının ortalamasını paylaşır), 'min' (tüm eşit değerlere en düşük sıra verilir), 'max' (tümüne en yüksek sıra verilir), 'first' (görünme sırasına göre sıralanır — eşitlik olmaz) ve 'dense' (sıralarda boşluk olmaz — 1, 2, 3, 3, 4; 1, 2, 3, 3, 5 yerine 1, 2, 3, 3, 4 olur). Yüzdelik dilim türü sıralamalar için en kullanışlı yöntem 'dense' yöntemidir.
import pandas as pd
s = pd.Series([80, 45, 90, 45, 70])
result = pd.DataFrame({
'value': s,
'average': s.rank(method='average'),
'min': s.rank(method='min'),
'max': s.rank(method='max'),
'first': s.rank(method='first'),
'dense': s.rank(method='dense')
})
print(result)groupby().rank() ile Gruplar İçinde Sıralama
groupby('group_col')['value_col'].rank(), her grup içinde bağımsız olarak sıralama hesaplar. Sıralama her grubun başında yeniden başlar; bu nedenle East bölgesindeki en iyi performans gösteren değer East içinde 1. sırayı, West bölgesindeki en iyi değer de West içinde 1. sırayı alır. groupby ile sıralamayı gruplar arası adil karşılaştırmalar için kullanışlı kılan özellik budur.
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({
'rep': list('ABCDEABCDE'),
'region': ['East']*5 + ['West']*5,
'sales': np.random.randint(30000, 100000, 10)
})
# Rank within each region (best = rank 1)
df['rank_in_region'] = df.groupby('region')['sales'].rank(ascending=False, method='min')
df_sorted = df.sort_values(['region', 'rank_in_region'])
print(df_sorted.to_string(index=False))rank(pct=True) ile Yüzdelik Dilim Sıralaması
rank() içinde pct=True ayarlandığında yüzdelik dilim sırası döndürülür: gruptaki değerlerin ne kadarının geçerli değere eşit veya ondan küçük olduğunu gösteren, 0 ile 1 arasında bir değer. 0.8 yüzdelik dilim sırası, değerin 80. yüzdelik dilimde olduğu ve tüm değerlerin %80'inden daha yüksek olduğu anlamına gelir. Bu normalleştirme, gerçek grup boyutlarını bilmeye gerek kalmadan farklı büyüklükteki gruplardaki değerlerin doğrudan karşılaştırılmasını sağlar.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({
'name': list('ABCDEFGHIJ'),
'region': ['East']*5 + ['West']*5,
'score': np.random.randint(50, 100, 10)
})
# Percentile rank within region
df['pct_rank'] = df.groupby('region')['score'].rank(pct=True)
df['percentile'] = (df['pct_rank'] * 100).round(0).astype(int)
print(df.sort_values(['region', 'percentile'], ascending=[True, False]).to_string(index=False))pd.qcut: Kantil Tabanlı Bölmelere Ayırma
pd.qcut(series, q), değerleri eşit frekanslı q bölmeye ayırır; böylece her bölme yaklaşık olarak aynı sayıda gözlem içerir. Eşit genişlikte aralıklar kullanan pd.cut'tan farklı olarak pd.qcut, aralık sınırlarını verilerin dağılımına göre uyarlar. Bu yöntem, performans kademeleri için çeyreklikler (q=4), beşlikler (q=5) veya ondalıklar (q=10) oluşturmak için idealdir.
import pandas as pd
import numpy as np
np.random.seed(42)
sales = pd.Series(np.random.exponential(scale=50000, size=100))
# Divide into quartiles
quartiles = pd.qcut(sales, q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])
result = pd.DataFrame({'sales': sales, 'quartile': quartiles})
print('Quartile counts (should be ~25 each):')
print(result['quartile'].value_counts().sort_index())
print('\nMean sales per quartile:')
print(result.groupby('quartile')['sales'].mean().round(0))pd.cut ve pd.qcut Karşılaştırması
pd.cut(series, bins=n), eşit genişlikte aralıklar oluşturur (aynı aralık, farklı sayılar). pd.qcut(series, q=n) ise eşit frekanslı aralıklar oluşturur (aynı sayı, farklı aralıklar). Çarpık verilerde pd.cut, kuyruğa yakın bölmelerin neredeyse boş kalmasına neden olurken pd.qcut gözlemleri eşit biçimde dağıtır. Aralık sınırlarının doğal bir iş anlamı olduğu durumlarda (fiyat aralıkları, yaş grupları) pd.cut'ı; eşit grup boyutları istediğiniz performans kademelerinde ise pd.qcut'ı seçin.
import pandas as pd
import numpy as np
np.random.seed(0)
# Right-skewed data
data = pd.Series(np.random.exponential(1, 100))
cut_result = pd.cut(data, bins=5).value_counts().sort_index()
qcut_result = pd.qcut(data, q=5).value_counts().sort_index()
print('Equal-width bins (pd.cut) — uneven counts:')
print(cut_result.to_string())
print('\nEqual-frequency bins (pd.qcut) — even counts:')
print(qcut_result.to_string())pd.qcut ile Ondalık Dilim Etiketleri Oluşturma
pd.qcut(series, q=10, labels=range(1,11)), her gözlemi kendi ondalık dilimine (1 ile 10 arasında) atar. Bu, pazarlama analizinde (müşteri değeri ondalık dilimleri), kredi puanlamasında (risk ondalık dilimleri) ve AB testlerinde (kohort analizi için trafik ondalık dilimleri) kullanılan standart bir tekniktir. labels parametresi, q ile aynı uzunlukta herhangi bir liste olabilir; daha okunabilir bir çıktı için ['Bottom 10%', ..., 'Top 10%'] gibi dizeler kullanın.
import pandas as pd
import numpy as np
np.random.seed(7)
customer_value = pd.Series(np.random.exponential(500, 1000))
# Assign to deciles 1-10
decile_labels = [f'D{i}' for i in range(1, 11)]
customer_decile = pd.qcut(
customer_value,
q=10,
labels=decile_labels
)
result = pd.DataFrame({'value': customer_value, 'decile': customer_decile})
print('Mean customer value per decile:')
print(result.groupby('decile')['value'].mean().round(0))Gruplar İçinde Yüzdelik Dilim Bölmeleri
transform kullanarak groupby ile pd.qcut'ı birleştirip her grup içinde yüzdelik dilim bölmeleri oluşturabilirsiniz. Bu, müşterileri genel olarak değil, her bölge içinde sıralamak istediğinizde kullanışlıdır; genel sıralamadaki en alt ondalık dilimde bulunan bir müşteri, kendi bölgesindeki ondalık dilimin en üstünde olabilir. groupby('group')['value'].transform(lambda x: pd.qcut(x, q=4, labels=['Q1','Q2','Q3','Q4'])) kullanın.
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({
'customer': range(20),
'region': ['North']*10 + ['South']*10,
'spend': np.random.randint(100, 1000, 20)
})
# Quartile within each region
def quartile_label(x):
return pd.qcut(x, q=4, labels=['Q1','Q2','Q3','Q4'])
df['region_quartile'] = df.groupby('region')['spend'].transform(quartile_label)
print(df.sort_values(['region', 'region_quartile']).to_string(index=False))Gruplar İçinde En İyi N Değer
Yaygın bir iş sorusu şudur: 'Her bölgedeki en iyi 3 performans gösteren kim?' groupby().rank() kullanıp ardından sıralamaya göre filtreleyin: df[df['rank_col'] <= 3]. Bu yöntem her grup boyutunda sorunsuz çalışır ve eşitlikleri uygun biçimde ele alır; kesme noktasında eşit sıralar varsa 3'ten fazla satırı korur. Alternatif olarak, her gruptaki en büyük n değeri doğrudan, bir sıra sütunu eklemeden döndüren groupby().nlargest(n) kullanılabilir.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({
'rep': [f'Rep_{i}' for i in range(15)],
'region': ['East']*5 + ['West']*5 + ['North']*5,
'revenue': np.random.randint(40000, 120000, 15)
})
df['region_rank'] = df.groupby('region')['revenue'].rank(ascending=False, method='min')
print('Top 2 per region:')
top2 = df[df['region_rank'] <= 2].sort_values(['region', 'region_rank'])
print(top2[['rep', 'region', 'revenue', 'region_rank']].to_string(index=False))Normalleştirme için Rank ve Transform Birlikte Kullanımı
Özgün DataFrame'e bir yüzdelik dilim sırası sütunu eklemek için groupby().rank(pct=True) ile transform'u birlikte kullanabilirsiniz. Bu normalleştirilmiş sütun, bir model özelliği olarak ham değerden genellikle daha kullanışlıdır; ölçekten bağımsızdır ve gruplar arasında karşılaştırılabilir. Makine öğrenmesinde yüzdelik dilim sıraları, aykırı değerlere karşı daha dayanıklı olan standartlaştırmaya (z puanına dönüştürmeye) basit bir alternatiftir.
import pandas as pd
import numpy as np
np.random.seed(1)
df = pd.DataFrame({
'product': np.random.choice(['A', 'B', 'C'], 30),
'score': np.random.randint(50, 100, 30)
})
# Percentile rank within each product group
df['global_pct'] = df['score'].rank(pct=True).round(3)
df['group_pct'] = df.groupby('product')['score'].rank(pct=True).round(3)
print(df.sort_values(['product', 'score']).head(12).to_string(index=False))Hızlı Kontrol
Bu dersteki sıra ve yüzdelik dilim işlemlerini anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: Series.rank(), eşitlikleri yapılandırılabilir biçimde ele alarak sayısal sıralar hesaplar; groupby().rank(), gruplar arası adil karşılaştırma için sıralamaları her grup içinde yeniden başlatır; pct=True, sıraları yüzdelik dilimlere (0 ile 1 arasında) dönüştürür; pd.qcut ise çeyreklik, ondalık ve yüzdelik dilim kademeleri atamak için eşit frekanslı bölmeler oluşturur. Sırada Pandas performans ipuçlarını; profil oluşturmayı, yavaş döngülerden kaçınmayı ve verimli veri türlerini inceleyeceğiz.
Yapay zeka eğitmeniyle Python öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 30
- Dersler
- 120
Sıkça Sorulan Sorular
“Gruplar İçinde Sıra ve Yüzdelik Dilim” dersi ücretsiz mi?
Evet — “Gruplar İçinde Sıra ve Yüzdelik Dilim” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Pandas & NumPy Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.
“Gruplar İçinde Sıra ve Yüzdelik Dilim” dersinde ne öğreneceğim?
groupby().rank() ile grup içi sıraları hesaplayın ve göreli karşılaştırmalar için pd.qcut ile yüzdelik dilim kutuları oluşturun. Pandas & NumPy Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Pandas & NumPy Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Pandas & NumPy Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Gruplar İçinde Sıra ve Yüzdelik Dilim” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Pandas & NumPy Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Pandas & NumPy Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Kayan Pencereler
- Genişleyen Pencereler
- Üstel Ağırlıklı Hareketli Ortalama
- Gruplar İçinde Sıra ve Yüzdelik Dilim