파이썬 λ§ˆμŠ€ν„°ν•˜κΈ° : apply(), map(), applymap() ν•¨μˆ˜

Posted by Euisuk's Dev Log on May 9, 2023

파이썬 λ§ˆμŠ€ν„°ν•˜κΈ° : apply(), map(), applymap() ν•¨μˆ˜

원본 κ²Œμ‹œκΈ€: https://velog.io/@euisuk-chung/파이썬-λ§ˆμŠ€ν„°ν•˜κΈ°-apply-map-applymap-ν•¨μˆ˜

파이썬 νŒλ‹€μŠ€ 심화

νŒλ‹€μŠ€(Pandas)λŠ” 맀우 λ‹€μ–‘ν•œ ν•¨μˆ˜μ™€ λ©”μ†Œλ“œλ₯Ό μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— 처음 μ‚¬μš©ν•˜λ©΄ ν—·κ°ˆλ¦΄ 수 μžˆλŠ” ν•¨μˆ˜λ“€μ΄ λ§ŽμŠ΅λ‹ˆλ‹€.

이번 ν¬μŠ€νŠΈμ—μ„œλŠ” apply(), applymap(), map(), reduce()와 같은 ν—·κ°ˆλ¦΄ 수 μžˆλŠ” ν•¨μˆ˜λ“€μ„ μ€‘μ‹¬μœΌλ‘œ κ°„λ‹¨ν•œ κ°œλ…κ³Ό 예제λ₯Ό μ†Œκ°œν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

  1. apply()

apply() λ©”μ†Œλ“œλŠ” μ‹œλ¦¬μ¦ˆ(Series)λ‚˜ λ°μ΄ν„°ν”„λ ˆμž„(DataFrame)의 각 μ›μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ°μ΄ν„°ν”„λ ˆμž„μ—μ„œλŠ” ν–‰(axis=0) λ˜λŠ” μ—΄(axis=1)을 κΈ°μ€€μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 λ°μ΄ν„°ν”„λ ˆμž„μ΄ μžˆλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€.

1
2
3
4
5
6
7
8
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
})

이 λ°μ΄ν„°ν”„λ ˆμž„μ—μ„œ 각 μ—΄μ˜ 합을 κ΅¬ν•˜κ³ μž ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 apply() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1
2
col_sum = df.apply(np.sum, axis=0)
print(col_sum)

μœ„ μ½”λ“œλŠ” apply() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 각 μ—΄μ˜ 합을 κ³„μ‚°ν•˜κ³  col_sum λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€. np.sum ν•¨μˆ˜λ₯Ό 첫 번째 인자둜 μ „λ‹¬ν•˜κ³ , axis=0을 두 번째 인자둜 μ „λ‹¬ν•˜μ—¬ 열을 κΈ°μ€€μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ μš©ν•©λ‹ˆλ‹€. 좜λ ₯ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1
2
3
4
A     6
B    15
C    24
dtype: int64
  1. applymap()

applymap() λ©”μ†Œλ“œλŠ” λ°μ΄ν„°ν”„λ ˆμž„(DataFrame)의 λͺ¨λ“  μ›μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 λ°μ΄ν„°ν”„λ ˆμž„μ΄ μžˆλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€.

1
2
3
4
5
6
7
import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
})

이 λ°μ΄ν„°ν”„λ ˆμž„μ˜ λͺ¨λ“  μ›μ†Œμ— 2λ₯Ό κ³±ν•˜κ³ μž ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 applymap() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1
2
df2 = df.applymap(lambda x: x * 2)
print(df2)

μœ„ μ½”λ“œλŠ” applymap() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°ν”„λ ˆμž„μ˜ λͺ¨λ“  μ›μ†Œμ— λžŒλ‹€(lambda) ν•¨μˆ˜λ₯Ό μ μš©ν•˜κ³ , κ²°κ³Όλ₯Ό df2 λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€. λžŒλ‹€ ν•¨μˆ˜λŠ” μž…λ ₯값에 2λ₯Ό κ³±ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€. 좜λ ₯ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1
2
3
4
   A   B   C
0  2   8  14
1  4  10  12
2  6  12  18

μ΄λ²ˆμ—λŠ” λ‹€λ₯Έ μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 λ°μ΄ν„°ν”„λ ˆμž„μ΄ μžˆλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€.

1
2
3
4
5
6
7
import pandas as pd

df = pd.DataFrame({
    'A': ['apple', 'banana', 'cherry'],
    'B': ['dog', 'cat', 'bird'],
    'C': [1, 2, 3]
})

이 λ°μ΄ν„°ν”„λ ˆμž„μ˜ λ¬Έμžμ—΄ 데이터λ₯Ό λͺ¨λ‘ λŒ€λ¬Έμžλ‘œ λ³€κ²½ν•˜κ³ μž ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 applymap() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1
2
df2 = df.applymap(lambda x: str(x).upper() if isinstance(x, str) else x)
print(df2)

μœ„ μ½”λ“œλŠ” applymap() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°ν”„λ ˆμž„μ˜ λͺ¨λ“  μ›μ†Œμ— λžŒλ‹€(lambda) ν•¨μˆ˜λ₯Ό μ μš©ν•˜κ³ , κ²°κ³Όλ₯Ό df2 λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€. λžŒλ‹€ ν•¨μˆ˜λŠ” λ¬Έμžμ—΄ 데이터에 λŒ€ν•΄μ„œλŠ” λŒ€λ¬Έμžλ‘œ λ³€κ²½ν•˜κ³ , κ·Έλ ‡μ§€ μ•Šμ€ κ²½μš°μ—λŠ” κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€. isinstance(x, str)λŠ” λ³€μˆ˜ xκ°€ λ¬Έμžμ—΄(str)인지 ν™•μΈν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€. 좜λ ₯ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1
2
3
4
       A     B  C
0  APPLE   DOG  1
1  BANANA   CAT  2
2  CHERRY  BIRD  3
  1. map()

μ΄μ–΄μ„œ ν˜Όλ™ν•˜κΈ° μ‰¬μš΄ ν•¨μˆ˜λ‘œ map()κ³Ό replace()λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

map() λ©”μ†Œλ“œλŠ” μ‹œλ¦¬μ¦ˆ(Series)μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€. μ‹œλ¦¬μ¦ˆμ˜ 각 μ›μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 μ‹œλ¦¬μ¦ˆκ°€ μžˆλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€.

1
2
3
import pandas as pd

s = pd.Series(['cat', 'dog', 'bird'])

이 μ‹œλ¦¬μ¦ˆμ˜ 각 λ¬Έμžμ—΄ λ°μ΄ν„°μ˜ 길이λ₯Ό κ΅¬ν•˜κ³ μž ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 map() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1
2
s2 = s.map(lambda x: len(x))
print(s2)

μœ„ μ½”λ“œλŠ” map() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹œλ¦¬μ¦ˆμ˜ 각 μ›μ†Œμ— λžŒλ‹€(lambda) ν•¨μˆ˜λ₯Ό μ μš©ν•˜κ³ , κ²°κ³Όλ₯Ό s2 λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€. λžŒλ‹€ ν•¨μˆ˜λŠ” μž…λ ₯κ°’μ˜ 길이λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 좜λ ₯ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1
2
3
4
0    3
1    3
2    4
dtype: int64
  1. replace()

replace() λ©”μ†Œλ“œλŠ” λ°μ΄ν„°ν”„λ ˆμž„(DataFrame)μ΄λ‚˜ μ‹œλ¦¬μ¦ˆ(Series)μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€. λ°μ΄ν„°ν”„λ ˆμž„μ΄λ‚˜ μ‹œλ¦¬μ¦ˆμ˜ 값을 λ‹€λ₯Έ κ°’μœΌλ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 μ‹œλ¦¬μ¦ˆκ°€ μžˆλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€.

1
2
3
import pandas as pd

s = pd.Series([1, 2, 3])

이 μ‹œλ¦¬μ¦ˆμ˜ 값을 λ‹€λ₯Έ κ°’μœΌλ‘œ κ΅μ²΄ν•˜κ³ μž ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 replace() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1
2
s2 = s.replace({1: 'apple', 2: 'banana', 3: 'cherry'})
print(s2)

μœ„ μ½”λ“œλŠ” replace() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹œλ¦¬μ¦ˆμ˜ κ°’ 1을 β€˜apple’, κ°’ 2λ₯Ό β€˜banana’, κ°’ 3을 β€˜cherryβ€™λ‘œ κ΅μ²΄ν•˜κ³ , κ²°κ³Όλ₯Ό s2 λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€. ꡐ체할 값을 λ”•μ…”λ„ˆλ¦¬(dictionary) ν˜•νƒœλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€. 좜λ ₯ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1
2
3
4
0     apple
1    banana
2    cherry
dtype: object

λ”•μ…”λ„ˆλ¦¬μ˜ ν‚€(key)λŠ” ꡐ체할 값을, κ°’(value)은 μƒˆλ‘œμš΄ κ°’μœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ replace() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λ°μ΄ν„°ν”„λ ˆμž„μ΄λ‚˜ μ‹œλ¦¬μ¦ˆμ˜ 값을 μ‰½κ²Œ ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€.



-->