Python

[Python] lambda

,,πŸͺ¨,, 2024. 10. 16. 23:55
λ°˜μ‘ν˜•

lambda ν•¨μˆ˜λŠ” 데이터λ₯Ό 핸듀링 ν•˜κΈ° μœ„ν•΄ pandas와 κ΄€λ ¨λœ map, apply λ“±κ³Ό ν•¨κ»˜ μœ μš©ν•˜κ²Œ 쓰인닀.

def ν‚€μ›Œλ“œλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것 λ˜ν•œ κ°€λŠ₯ν•˜μ§€λ§Œ κ°„λ‹¨ν•œ μ „μ²˜λ¦¬λ₯Ό μœ„ν•΄μ„  1회용 ν•¨μˆ˜μΈ lambda ν•¨μˆ˜λ₯Ό 주둜 μ‚¬μš©ν•œλ‹€.

일반적인 ν•¨μˆ˜μ™€ lambda ν•¨μˆ˜μ˜ 비ꡐ


일반적인 def ν‚€μ›Œλ“œλ‘œ μƒμ„±ν•˜λŠ” ν•¨μˆ˜λŠ” μ•„λž˜μ™€ κ°™λ‹€.

In [2]:

def plus(left, right):
    result = left + right
    return result

plus(10, 20)

Out[2]:

30

μ΄λ²ˆμ—λŠ” 같은 ν•¨μˆ˜λ₯Ό lambda ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ λ§Œλ“€μ–΄λ³΄μž

In [6]:

f = lambda x, y:x + y

f(10, 20)

Out[6]:

30

μœ„μ™€ 같이 lambda에 λ§€κ°œλ³€μˆ˜λ₯Ό μ§€μ •ν•˜κ³  :(콜둠) λ’€ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  계산식을 μ§€μ •ν•œλ‹€.

그리고 lambda의 νŠΉμ§• 쀑 ν•˜λ‚˜λŠ” νŠΉμ • λ³€μˆ˜μ— ν• λ‹Ήν•΄μ„œ μ‚¬μš©ν•΄μ•Όν•œλ‹€. μ΄λŸ¬ν•œ 이유둜 lambda ν•¨μˆ˜κ°€ 읡λͺ… ν•¨μˆ˜λ‘œ λΆˆλ¦¬κΈ°λ„ ν•œλ‹€.

μ•„λž˜μ˜ 그림을 보고 일반 ν•¨μˆ˜μ™€ lambda ν•¨μˆ˜μ˜ 차이λ₯Ό μ΄ν•΄ν•˜μž.

μ°Έκ³ ) 코딩도μž₯

lambda ν‘œν˜„μ‹ 자체λ₯Ό 호좜


μ•žμ˜ μ„€λͺ…μ—μ„œ lambda ν•¨μˆ˜λŠ” νŠΉμ • λ³€μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€κ³  μ„€λͺ…ν–ˆλ‹€. ν•˜μ§€λ§Œ lambda ν‘œν˜„μ‹ κ·Έ 자체둜 μ‚¬μš©ν•˜λŠ” 방법이 μ—†μ§„ μ•Šλ‹€. κ·Έ 방법은 λ°”λ‘œ κ΄„ν˜Έλ₯Ό μ΄μš©ν•˜λŠ” 것이닀.

In [9]:

# 5의 μ œκ³±μ„ ꡬ함ㅠ

(lambda x: x**2)(5)

Out[9]:

25

lambda ν‘œν˜„μ‹ μ•ˆμ—μ„œ λ³€μˆ˜ 생성은 λΆˆκ°€λŠ₯ν•˜λ‹€


In [10]:

(lambda x: y = 10, x + y)(1)
  File "<ipython-input-10-a9403626418d>", line 1
    (lambda x: y = 10, x + y)(1)
                 ^
SyntaxError: invalid syntax

ν•˜μ§€λ§Œ lambda ν‘œν˜„μ‹ 밖에 μžˆλŠ” λ³€μˆ˜μ˜ μ‚¬μš©μ€ κ°€λŠ₯ν•˜λ‹€. μ•„λž˜μ˜ μ˜ˆμ‹œλ‘œ μ΄ν•΄ν•΄λ³΄μž

In [12]:

# μ΅œμ’…μ μœΌλ‘œ lambda ν‘œν˜„μ‹μ—λŠ” x에 5κ°€ μž…λ ₯, y에 10이 μž…λ ₯λœλ‹€.

y = 10
(lambda x: x + y)(5)

Out[12]:

15

lambda ν•¨μˆ˜ 예제


In [16]:

# x와 yλ₯Ό λ”ν•˜λŠ” lambda ν•¨μˆ˜μ‹

(lambda x, y: x+y)(10, 20)

Out[16]:

30

In [18]:

# λŒ€λ¬Έμžλ‘œ λ§Œλ“œλŠ” lamba ν•¨μˆ˜μ‹

(lambda x: x.upper())('abc')

Out[18]:

'ABC'

In [19]:

# μ†Œλ¬Έμžλ‘œ λ§Œλ“œλŠ” lambda ν•¨μˆ˜μ‹

(lambda x: x.lower())('ABC')

Out[19]:

'abc'
  • lambda μ‹μ—μ„œ if문은 λ°˜λ“œμ‹œ if elseλ₯Ό λͺ…μ‹œ

In [30]:

# 짝수면 제곱, μ•„λ‹ˆλ©΄ κ·ΈλŒ€λ‘œ μœ μ§€

f = lambda x: x**2 if x % 2 == 0 else x

print(f(10))
print(f(5))
100
5

In [31]:

# strν˜•μ΄λ©΄ μ†Œλ¬Έμžλ‘œ μ•„λ‹ˆλ©΄ κ·ΈλŒ€λ‘œ μœ μ§€

f = lambda x: x.lower() if type(x)=='str' else x

print(f('ABC'))
print(f(10))
ABC
10

filter


In [36]:

# filterν•¨μˆ˜μ™€ lambda 식을 μ΄μš©ν•΄ 짝수인 데이터λ₯Ό μΆ”μΆœν•˜μ‹œμ˜€

arr = np.arange(10)

result = filter(lambda x: x%2==0, arr)

print(list(result))
[0, 2, 4, 6, 8]

map


  • map ν•¨μˆ˜λŠ” Seriesλ₯Ό λŒ€μƒμœΌλ‘œ ν•¨μˆ˜ 적용

In [42]:

import pandas as pd

df = pd.DataFrame({"age":[30,25,25,12,40],
                  "height":[178,180,160,140,176],
                  "weight":[80,100,55,40,70]})

df

Out[42]:

ageheightweight01234

30 178 80
25 180 100
25 160 55
12 140 40
40 176 70

In [43]:

# map ν•¨μˆ˜μ™€ lambda ν•¨μˆ˜μ‹μ„ μ΄μš©ν•΄ weightλ₯Ό pund둜 λ³€ν™˜ν•˜μ‹œμ˜€ * 2.205

df['weight'] = df['weight'].map(lambda x: x*2.205)
df

Out[43]:

ageheightweight01234

30 178 176.400
25 180 220.500
25 160 121.275
12 140 88.200
40 176 154.350

apply


  • apply ν•¨μˆ˜λŠ” 전체 Series(컬럼)을 λŒ€μƒμœΌλ‘œ ν•¨μˆ˜λ₯Ό μ μš©ν•©λ‹ˆλ‹€.

In [46]:

# 학생 λ°μ΄ν„°ν”„λ ˆμž„μ˜ 전체 컬럼의 μ΅œλŒ“κ°’ - μ΅œμ†Ÿκ°’μ„ κ³„μ‚°ν•˜μ‹œμ˜€

df.apply(lambda x: x.max() - x.min())

Out[46]:

age        28.0
height     40.0
weight    132.3
dtype: float64

applymap


  • applymap ν•¨μˆ˜λŠ” DF의 λͺ¨λ“  element에 λŒ€ν•΄ ν•¨μˆ˜λ₯Ό μ μš©ν•©λ‹ˆλ‹€. (axis 인자 X)

In [47]:

# λ°μ΄ν„°ν”„λ ˆμž„μ˜ 전체 element에 λŒ€ν•΄ 음수둜 λ³€κ²½ν•˜μ‹œμ˜€

df.applymap(lambda x: -x)

Out[47]:

ageheightweight01234

-30 -178 -176.400
-25 -180 -220.500
-25 -160 -121.275
-12 -140 -88.200
-40 -176 -154.350

In [ ]:

λ°˜μ‘ν˜•