SQL Sorgularının Python Pandas Dataframe Karşılıkları-2 (GROUP BY, ORDER BY)
Merhabalar. Yaygın kullanılan SQL sorgularının Python pandas dataframe karşılıklarını bir örnek üzerinden paylaşmaya devam ediyoruz. Serimizin ilki olan bir önceki yazımızda SELECT ve WHERE cümlecikleri ile ilgili örnek yapmıştık. Bu yazıda kullanılacak veri kaynaklarına (sql ve pandas) ulaşmak için lütfen ilk yazıya müracaat ediniz.
1. GROUP BY
GROUP BY özellikle veri keşfinde çok sık kullanılan bir SQL cümleciğidir. GROUP BY ile verinin kategorilere göre nasıl dağıldığını ve hangi kategorinin ne kadar tekrarlandığını, ortalamasını, toplamını vb. bilgileri öğrenebiliriz.
select meslek, avg(aylik_gelir) as ortalama_gelir, avg(yas) as ortlama_yas from simple_data group by meslek limit 5
meslek | ortalama_gelir | ortlama_yas |
---|---|---|
Doktor | 16125.00 | 35.00 |
6750.00 | 32.00 | |
Memur | 4066.66 | 36.00 |
Isci | 3500.00 | 35.00 |
Tornacı | 4200.00 | 43.00 |
Pandas ile
df.groupby(['meslek'])['aylik_gelir','yas'] \ .agg(['mean']) \ .reset_index() \ .head(5)
meslek | aylik_gelir | yas | |
---|---|---|---|
mean | mean | ||
0 | Berber | 9866.666667 | 46.0 |
1 | Doktor | 16125.000000 | 35.0 |
2 | Isci | 3500.000000 | 35.0 |
3 | Memur | 4066.666667 | 36.0 |
4 | Müzisyen | 10500.000000 | 30.5 |
Arada fark var. Bunun iki sebebi var. SQL meslek sütunundaki boş değerleri de bir kategori olarak kabul ederken pandas bunu yapmadı. İkincisi pandas birşey belirtmememize rağmen mesleğe göre sıralama yaptı. SQL’de ise belirgin bir sıralama görünmüyor. Şimdi sıralama kriteri koyalım.
2. ORDER BY
select meslek, avg(aylik_gelir) as ortalama_gelir, avg(yas) as ortlama_yas from simple_data group by meslek order by ortalama_gelir desc limit 5
meslek | ortalama_gelir | ortlama_yas |
---|---|---|
Doktor | 16125 | 35.0000000000000000 |
Müzisyen | 10500 | 30.5000000000000000 |
Berber | 9866.666666666666 | 46.0000000000000000 |
6750 | 32.0000000000000000 | |
Pazarlamaci | 5750 | 29.0000000000000000 |
Pandas ile
df.groupby(['meslek'])['aylik_gelir','yas'] \ .agg(['mean']) \ .reset_index() \ .sort_values([('aylik_gelir','mean')], ascending=False) \ .head(5)
meslek | aylik_gelir | yas | |
---|---|---|---|
mean | mean | ||
1 | Doktor | 16125.000000 | 35.0 |
4 | Müzisyen | 10500.000000 | 30.5 |
0 | Berber | 9866.666667 | 46.0 |
5 | Pazarlamaci | 5750.000000 | 29.0 |
7 | Tuhafiyeci | 4800.000000 | 47.0 |
Şimdi ikisi tarafından elde edilen sonuçlar birbirine yaklaştı. Farklılık yine NaN değerli mesleklerin pandas tarafından dikkate alınmasından kaynaklanıyor. Bir sonraki yazımızda UPDATE ve DELETE operasyonlarına örnekler vereceğiz. Hoşçakalın…