Python’da Lambda Kullanımı ile Pandas Apply, Filter, Map ve Reduce Üzerinden Uygulamalı Anlatımı

Yiğit Şener
4 min readAug 30, 2020

--

Bilindiği üzere Python’da def anahtar kelimesi ile başlayan fonksiyon tanımlama işlemlerinde def sonrası bu fonksiyona bir isim verilir. Python’da anonim (anonymous) fonksiyonlar ise isimsiz olarak oluşturulurlar. Bunlardan birisi olan Lambda aşağıdaki parametreleri alan bir yapıya sahiptir.

Lambda Argüman(lar): İfade (expression)

Örnek lambda fonksiyonu ile def yazılan fonksiyonu aşağıdaki gibi karşılaştırılabilir.

""" def """
def karesiniAl(x):
return x ** 2
print(karesiniAl(8))
# ÇIKTI: 64

""" lambda """
print((lambda x: x ** 2)(8))
# ÇIKTI: 64
kare_al = lambda x: x ** 2
print(kare_al(8))
# ÇIKTI: 64

Lambda fonksiyonları bilinen def fonksiyonlarının içinde, map(), filter(), reduce() veya Pandas kütüphanesindeki appy() fonksiyonları ile birlikte kullanılabilir.

Lambda Fonksiyonun Özellikleri

  • Lambda fonksiyonu birden çok argüman (x, y, z,…) alabilir ancak eleme ya da dönüş işlemeleri için yalnız tek bir ifade (expression) alabilir.
  • Lambda, fonksiyon objesinin herhangi bir yerinde talep edilirse orada kullanılabilir.
  • Lambda fonksiyonlarının sözdizimsel (syntax) olarak tek bir ifadeyle sınırlı olduğunun bilinmesi gerekmektedir.
  • Python’da farklı programlama süreçleri içinde çeşitli kullanım alanları mevcuttur.
  • Lambda fonksiyonları mevcutta isim almaz ancak bir değişkene atanabilir.
  • Tek satırlı bir yapıya sahip olan Lambda daha hızlı ve performanslı sonuçlar oluşturabilir.

def İçinde Tanımlanan Lambda

Lambda fonksiyonu def ile tanımlanan bir fonksiyonun içerisinde yer alabilir. Bu yüzden tanımlanan fonksiyon en az iki defa değer almaktadır.

def funksiyon(numara):
return lambda x: x * numara

# fonksiyonun ilk değerinin tanımlanması
ilk_halka = funksiyon(5)
print(ilk_halka)
# ÇIKTI: <function func.<locals>.<lambda> at 0x0000025D29250F28>

# lamda fonksiyonuna ulaşan değer
ikinci_halka = funksiyon(5)(2)
print(ikinci_halka)
# ÇIKTI: 10

İlk halkada görüldüğü üzere return parametresine kadar olan süreç fonksiyona tanımlanmış oldu. Fonksiyon hata vermedi ancak önbellekte Lambda için yeni bir fonksiyon yarattı. Yeni gönderilen değer ile birlikte lambda fonksiyonu çalışarak sonucu döndürdü.

Filter ile Lambda Kullanımı

Python içinde tanımlı gelen filter() fonksiyonu içerisine koşul olarak lambda’da gelen ifadeyi ve argümanları (liste veya dizi) alır. Koşul ifadesinde True dönen değerler dışarıya çıkarılır.

# Örnek liste
list_number = [2, 4, 6, 8, 9, 10, 12, 13]

# 7'den büyük 14'ten küçük sayıların döndürülmesi
filtered_liste = list(filter(lambda x: (x > 7) and (x < 12), list_number))
print(filtered_liste)
# ÇIKTI: [8, 9, 10]

# 2'ye bölübilen sayıların bulunması
filtered_liste_2 = list(filter(lambda x: (x % 2 == 0), list_number))
print(filtered_liste_2)
# ÇIKTI: [2, 4, 6, 8, 10, 12]

Map ile Lambda Kullanımı

Map fonksiyonu iterative bir sözlük (dictionary) veya bir liste alabilir. Map() fonksiyonu, lambda tarafından tanımlanan mantığa göre, temelde, girdideki her ögeyi yinelenebilen çıktıya karşılık gelen ögeyle eşleştirir. Aşağıda örneği mevcuttur.

# Örnek liste
list_0 = [5, 7, 22, 9875]

# 2'ye bölümden kalanın bulunması
final_list = list(map(lambda x: x % 2 , list_0))
print(final_list)

# İki listenin birleştirilmesi
list_1 = ["A", "B", "C"]
list_2 = [1, 2, 3]
list_merge = list(map(lambda x, y: (x + "_" + str(y)), list_1, list_2))
print(list_merge)
# ÇIKTI: ['A_1', 'B_2', 'C_3']

# Map içinde sözlük ve lambda kullanımı
dict_1 = {
1: 'A',
2: 'B',
3: 'C',
4: 'D',
}

dictChange = dict(map(lambda x: (x[0], x[1] + '_' + str(x[0])), dict_1.items() ))
print(dictChange)
# ÇIKTI: {1: 'A_1', 2: 'B_2', 3: 'C_3', 4: 'D_4'}

Map fonksiyonunda lambda kullanımı sayesinde bir veri türü için işlevsel kısa yolları kullanmak mümkündür. En başta kafa karıştırıcı olsa da zamanla eğlenceli bir hale gelebilir.

Reduce ile Lambda Kullanımı

Reduce fonksiyonu functools adlı bir kütüphane yoluyla Python script’ine tanıtıldıktan sonra kullanılabilir. Bu fonksiyon ve lambda kullanılarak liste içindeki her bir eleman bir sonraki eleman ile operatif (+,- ,* vb) bir bağ kurar. Örneğin;

from functools import reduce

sum_list = reduce(lambda x, y: x + y, [1, 5, 10, 100])
print(sum_list)
# ÇIKTI: 116

Lambda fonksiyonunda liste içerisindeki her bir elemanı aşağıdaki sekliyle toplar.

((((1) + 5) + 10) + 100) = 116

Pandas Apply Fonksiyonu ile Lambda Kullanımı

Pandas DataFrame yapısında yer alan apply() fonksiyonu içerisinde lambda kullanarak var olan değişkenin içerisinde değişiklik yapabilir ya da DataFrame objesi içerisinde yer alan değişkenlerden yeni değişkenler türetilebilir.

import pandas as pd
import numpy as np
from datetime import datetime

df = pd.DataFrame({
'name':['Weber', 'Durkheim', 'Comte'],
'yearOfBirth':[1864, 1858, 1798],
'countOfBook':[18, 10, 15]
})

# Değişken içerisinde normalizasyon
# 0 ve 1 arasına değerleri indirgeme
minValue = df["countOfBook"].min()
minMaxDifferenceValue = df["countOfBook"].max() - df["countOfBook"].min()

# apply ve lambda fonksiyonu ile normalizasyon
df["countOfBook"] = df["countOfBook"].apply(lambda x: (x - minValue) / minMaxDifferenceValue)
print(df["countOfBook"] )
# ÇIKTI:
# 0 1.000
# 1 0.000
# 2 0.625

# Doğum yıllarına göre yaş hesaplayarak
# Yeni değişkene yazdırılması
df["age"] = df["yearOfBirth"].apply(lambda x: datetime.today().year - x)
print(df)

Sonuç

Popüler programlama dillerinden birisi olan Python’la ilgilenen herkes için yeni yollar ve kısa yollar keşfetmek mümkün ve bir o kadarda eğlenceli.

Diğer Yazılarım

--

--