Garfield
YZF Admin
Series.apply() ve DataFrame.apply(), sırasıyla Series veya DataFrame üzerinde Python işlevini satır, sütun ya da tek tek değerler düzeyinde çalıştırmak için kullanılır. Özellikle her girdiye aynı kuralla dönüşüm uygulamak, birden fazla sütunu birlikte değerlendirmek veya hazır vektörel pandas işlemlerinin karşılamadığı özel kuralları kodlamak için uygundur. Ancak basit aritmetik, metin ve karşılaştırma işlemlerinde önce vektörel yöntemleri; tek sütundaki tekil değer dönüşümlerinde ise çoğu zaman map() veya Series yöntemlerini tercih etmek daha anlaşılır ve hızlıdır.apply() hangi dönüşümlerde kullanılır?
apply() temel olarak bir işlemi eksen boyunca tekrarlar. DataFrame için axis=0 sütunları, axis=1 satırları temsil eder. Series üzerinde normal bir Python işlevi, varsayılan by_row="compat" davranışında her değere uygulanır. by_row=False verilirse işlev Series’in tamamını alır; NumPy ufunc’ları da tüm Series üzerinde uygulanabilir.En yaygın kullanım alanları şunlardır:
- Bir sütundaki değeri koşula göre dönüştürmek.
- Aynı satırdaki birden fazla sütunu birlikte kullanarak yeni bir sonuç üretmek.
- Her sütuna veya satıra özel bir hesaplama yapmak.
- Bir hücredeki liste, sözlük veya özel nesne gibi karmaşık verileri işlemek.
- Hazır pandas işlevleriyle doğrudan ifade edilemeyen özel bir Python işlevini çalıştırmak.
Series.apply() kullanılabilir. Satırdaki birden fazla sütun gerektiğinde ise DataFrame.apply(axis=1) seçilir.Tek sütunda koşullu dönüşüm
Varsayımsal olarak aşağıdaki veride puanı 50 ve üzeri olanları "Başarılı", diğerlerini "Başarısız" yapmak istediğinizi düşünelim:
Python:
import pandas as pd
df = pd.DataFrame({
"ogrenci": ["Ali", "Ayşe", "Mehmet"],
"puan": [75, 42, 60]
})
df["durum"] = df["puan"].apply(
lambda puan: "Başarılı" if puan >= 50 else "Başarısız"
)
print(df)
Beklenen sonuçta
durum sütununda sırasıyla "Başarılı", "Başarısız" ve "Başarılı" değerleri bulunur. Burada apply() her puanı tek tek işlemiş ve koşulun sonucunu yeni sütuna yazmıştır. Bu kod, puanın geçerli olduğunu kanıtlamaz; eksik veya metin biçimindeki puanlar varsa önce veri türünü ve eksik değerleri ele almak gerekir.Birden fazla sütunu kullanarak dönüşüm
Bir satırdaki değerler birlikte değerlendirilmeliyse
axis=1 kullanılır. Örneğin puan ve devam oranına göre bir sonuç üretilebilir:
Python:
def karar_ver(satir):
if satir["puan"] >= 50 and satir["devam_orani"] >= 0.75:
return "Koşulları sağlıyor"
return "Koşulları sağlamıyor"
sonuc = pd.DataFrame({
"puan": [80, 70, 45],
"devam_orani": [0.90, 0.60, 0.95]
})
sonuc["karar"] = sonuc.apply(karar_ver, axis=1)
print(sonuc)
axis=1, karar_ver() işlevine her seferinde tek bir satır gönderir. Böylece işlev hem puan hem de devam_orani değerini okuyabilir. Sütun adlarından biri yanlış yazılırsa işlem KeyError verebilir; bu durumda önce sonuc.columns çıktısıyla gerçek sütun adlarını kontrol edin.apply() yerine hangi yöntemi seçmelisiniz?
Aynı işi birden fazla pandas yöntemiyle yapmak mümkün olabilir. Seçim, dönüşümün tek değere mi, satıra mı, sütuna mı uygulandığına ve hazır bir vektörel işlemin bulunup bulunmadığına göre yapılır.
| İhtiyaç | Uygun yöntem | Neden |
|---|---|---|
| Sayısal sütuna aynı aritmetik işlemi uygulama | Vektörel işlem | Örneğin df["puan"] + 5 daha kısa ve genellikle daha verimlidir. |
| Tek sütundaki değerleri sözlükle eşleme | map() | Her değerin karşılığını açıkça belirtir. |
| Tek sütunda özel Python işlevi çalıştırma | Series.apply() | Her değeri bağımsız olarak dönüştürür. |
| Birden fazla sütuna göre satır sonucu üretme | DataFrame.apply(axis=1) | İşlev aynı satırın birden fazla sütununa erişebilir. |
| Her sütun için ayrı özet hesaplama | DataFrame.apply(axis=0) | İşlev her sütunu bir Series olarak alır. |
| Metin üzerinde hazır işlem yapma | str yöntemleri | Örneğin df["ad"].str.upper() amacı doğrudan ifade eder. |
apply(lambda metin: metin.upper()) yazılabilir; fakat df["ad"].str.upper() hem niyeti daha açık gösterir hem de pandas'ın metin işlemleri için tasarlanmış yöntemini kullanır. Benzer şekilde iki sütunu doğrudan toplayabiliyorsanız apply(axis=1) yerine df["urun"] + " - " + df["kod"] gibi vektörel bir ifade tercih edilebilir.axis seçimi ve dönüş sonucunu yorumlama
DataFrame.apply() içinde axis=0 kullanıldığında işlev her sütunu, axis=1 kullanıldığında her satırı alır. Varsayılan değer axis=0 olduğundan, satır bazlı bir hesaplamada axis=1 yazmayı unutmak en sık karşılaşılan hatalardan biridir.İşlevin döndürdüğü değerin biçimi de sonucu etkiler. Her satır veya sütun için tek bir değer döndürürseniz genellikle Series elde edersiniz.
axis=1 ile liste döndüren bir işlev, varsayılan olarak listeleri içeren bir Series üretir; liste elemanlarını sütunlara açmak için result_type="expand" kullanılır. İşlev her satır için bir Series döndürürse sonuç sütunlara açılır. Bu nedenle işlemden sonra type(sonuc), sonuc.shape ve sonuc.head() ile çıktının türünü, boyutunu ve ilk satırlarını kontrol edin.Eksik değerler için de açık karar verin. Örneğin
puan sütununda NaN varsa karşılaştırma beklediğiniz sonucu vermeyebilir. Eksik değerleri önce doldurabilir, ayrı bir durum olarak işleyebilir veya ilgili satırları dışarıda bırakabilirsiniz. apply() eksik veriyi otomatik olarak anlamlandırmaz; yalnızca verdiğiniz işlevi çalıştırır.Kısa karar kuralı
İşlem tek bir sütundaki her değeri dönüştürüyor ve hazır bir
.str, .dt, map() veya vektörel ifade varsa önce onu kullanın. Dönüşüm özel bir Python kuralı gerektiriyorsa Series.apply() uygundur. Sonuç için aynı satırdaki birkaç sütun birlikte gerekiyorsa DataFrame.apply(..., axis=1) kullanın. İşlem tamamlandığında yeni sütunun değerlerini, veri türünü ve satır sayısını kontrol ederek dönüşümün beklediğiniz biçimde gerçekleştiğini doğrulayın.