Updated:

import pandas as pd
import numpy as np

1. DataFrame에 함수 적용하기

1.1. DataFrame에 함수 적용하기

DataFrame은 for-loop를 사용할 필요없이 DataFrame에 함수를 적용할 수 있는 메소드를 제공해준다.

df.apply(func,axis=0)

  • func : DataFrame에 적용할 함수 이름
  • axis는 NumPy를 따른다.
data = np.random.randint(1,100,(6,5))

df = pd.DataFrame(data,index = list('abcdef'), columns=['col ' + str(i) for i in range(1,6)])

df
col 1 col 2 col 3 col 4 col 5
a 31 83 63 98 18
b 24 96 35 30 99
c 80 63 15 90 12
d 81 71 20 25 29
e 20 98 25 88 20
f 31 7 60 39 31
df.apply(np.cumprod)
col 1 col 2 col 3 col 4 col 5
a 31 83 63 98 18
b 744 7968 2205 2940 1782
c 59520 501984 33075 264600 21384
d 4821120 35640864 661500 6615000 620136
e 96422400 3492804672 16537500 582120000 12402720
f 2989094400 24449632704 992250000 22702680000 384484320
df.apply(np.cumprod,axis=1)
col 1 col 2 col 3 col 4 col 5
a 31 2573 162099 15885702 285942636
b 24 2304 80640 2419200 239500800
c 80 5040 75600 6804000 81648000
d 81 5751 115020 2875500 83389500
e 20 1960 49000 4312000 86240000
f 31 217 13020 507780 15741180
df.apply(lambda x: x.mean() - x.std())
col 1    16.295390
col 2    36.059128
col 3    15.725891
col 4    27.969980
col 5     2.612740
dtype: float64

1.2. column에 함수 적용하기

DataFrame말고 특정 column에 함수를 적용할 수 있다.

df[col_name].apply(func,axis=0)과 같이 사용하면되고 나머지 방법은 DataFrame에서 사용하는 apply와 방법이 똑같다.

data = np.random.rand(6,5) * 20

df = pd.DataFrame(data,index = list('abcdef'), columns=['col ' + str(i) for i in range(1,6)])

df
col 1 col 2 col 3 col 4 col 5
a 14.053738 4.185958 8.462147 9.553656 12.509743
b 18.348219 19.926258 11.843050 17.556651 7.280544
c 19.710057 7.822683 10.415486 9.005349 11.622472
d 4.833044 2.655133 16.890674 6.622639 17.183202
e 1.491357 5.968906 7.721816 9.442697 6.192048
f 10.398943 17.934551 17.050292 5.622842 10.727492
df['col 1'].apply(np.trunc)
a    14.0
b    18.0
c    19.0
d     4.0
e     1.0
f    10.0
Name: col 1, dtype: float64

2. map

Series의 map 메소드는 Series의 각 value를 다른 value로 바꾸거나 각 value에 함수를 적용할 때 사용된다.

Series에만 적용된다는 것에 주의해야한다. 따라서 DataFrame에 적용할 수는 없고 column에 적용할 수 있다.

Series.map(arg,na_action=None)

  • arg: 값을 넣은 dictionary나 함수 이름을 넣는다.
  • na_action: ‘ignore’이면 NaN에는 적용이 되지 않는다.
s = pd.Series(["dog","cat","eagle","rabbit"])

s
0       dog
1       cat
2     eagle
3    rabbit
dtype: object
s.map({animal: animal+"s" for animal in s})
0       dogs
1       cats
2     eagles
3    rabbits
dtype: object
s = pd.Series(np.random.uniform(10,50,(5,)))

s
0    25.981592
1    20.995231
2    35.596201
3    43.628246
4    24.256641
dtype: float64
s.map(np.trunc)
0    25.0
1    20.0
2    35.0
3    43.0
4    24.0
dtype: float64

3. applymap

apply가 각 row별로 또는 column별로 적용이 된다면 applymap은 원소별로 적용이 된다.

특정 함수에 따라서 apply와 applymap이 비슷하게 동작할 수는 있으나 둘은 작동방식에 있어 엄연히 차이가 난다는 것을 기억하자

df.applymap(func,na_action=None)

  • func : 적용할 함수 이름
  • na_action: ‘ignore’이면 NaN에 대해서는 적용되지 않는다.
data = np.random.rand(6,5) * 20

df = pd.DataFrame(data,index = list('abcdef'), columns=['col ' + str(i) for i in range(1,6)])

df
col 1 col 2 col 3 col 4 col 5
a 5.357879 9.412591 13.617003 12.760888 0.950344
b 1.235938 6.882730 4.173534 18.967401 5.843447
c 0.450929 7.948630 4.506180 16.463640 3.449097
d 13.320694 18.387282 3.808073 1.867454 13.546942
e 1.406042 6.796554 9.490889 7.089272 5.998784
f 19.606024 0.927500 12.849440 16.924449 1.271375
df.applymap(np.trunc)
col 1 col 2 col 3 col 4 col 5
a 5.0 9.0 13.0 12.0 0.0
b 1.0 6.0 4.0 18.0 5.0
c 0.0 7.0 4.0 16.0 3.0
d 13.0 18.0 3.0 1.0 13.0
e 1.0 6.0 9.0 7.0 5.0
f 19.0 0.0 12.0 16.0 1.0

Leave a comment