Language/Python

[Python] Pandas 그룹 함수 적용 메서드 (map, apply, applymap)

나는 정은 2022. 10. 5. 11:30

 

Pandas

: 그룹 별로 간단한 함수를 정의할 수 있는 방법

for문 iteration을 돌지 않고도 시간을 절약하여 한꺼번에 함수를 적용시킬 수 있도록 도와준다

 

map

data.map( func , **iterable )

pandas Series 객체에만 적용할 수 있는 메서드

한 개 변수에 대한 값을 매핑하여 일괄적으로 변환하고자 할때 사용

인덱스가 잘 맞춰져 있다면 값 전환을 할 수가 있다.

수학의 합성함수와 유사하다.

s = pd.Series(['cat', 'dog', np.nan, 'rabbit'])

0      cat
1      dog
2      NaN
3   rabbit
dtype: object
s.map('I am a {}'.format)
0       I am a cat
1       I am a dog
2       I am a nan
3       I am a rabbit
dtype: object
 
 

apply

Series나 DataFrame의 지정된 축을 따라 함수를 적용하는 데 사용.

column을 추가할 때 lambda에 적당한 함수를 넣어서 값을 계산할 수 있다.

한 번에 전체 행 또는 열에 대해 작동한다.

벡터화할 수 없는 함수 를 적용 apply() 할 때 주로 사용된다.

 

row, column이 존재하기 때문에 축을 잘 설정해야 한다.

예를 들어 각 column의 합계를 구하고 싶을때는 axis=0로 하면 되고 row의 합계는 axis=1로 지정해준다.

import numpy as np

df = pd.DataFrame(np.arange(12).reshape(4,3),columns=['a','b','c'])
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9
3  2  4  6

 

#column 별 합계를 구하는 lambda식 
df.apply(lambda x:x.sum())
a  14
b  22
c  24
dtype: int64

 

#row별 합계를 구하는 lambda식
df.apply(lambda x:x.sum(),axis=1)
0  6
1  15
2  24
3  12
dtype: int64
 
  • lambda 식을 사용하여 새로운 칼럼을 생성할 수도 있다 !

applymap

Pandas DataFrame 객체에만 적용할 수 있는 메서드

applymap은 apply와 형식은 비슷하지만 접근하는 개체가 개별적이다.

 

지정된 기능(lambda)을 각 요소 별로 적용할 수 있다.

lambda에서 if 와 같이 조건을 넣을 수 있지만 applymap은 각 원소를 기준으로 데이터를 변환한다.

여러 행이나 열의 값에 접근하여 개별적으로 변환할 때 사용된다 .

df = pd.DataFrame(np.arange(12).reshape(4,3),columns=['a','b','c'])
    a	b	c
0	0	1	2
1	3	4	5
2	6	7	8
3	9	10	11
 
df.applymap(lambda x:'%.2f'% x)
     a	     b	     c
0	0.00	1.00	2.00
1	3.00	4.00	5.00
2	6.00	7.00	8.00
3	9.00	10.00	11.00

 

 apply와 applymap의 차이

if ~ else 구문을 넣어보면 조금 더 명확하게 apply와 applymap의 차이에 대해 알 수있다.

df.applymap(lambda x : '%.2f'% x if (x >= 10)  else 0)
	a	b	c
0	0	0	0
1	0	0	0
2	0	0	0
3	0	10.00	11.00
 
  • apply의 경우 조건문을 넣어주니 오류가 뜬다.
    • 이 경우 특정 칼럼에 대해 처리해주도록 코드를 바꿔주면 실행이 된다 !
df.apply(lambda x : '%.2f'% x if (x >= 10)  else 0)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
 
df['c'].apply(lambda x : '%.2f'% x if (x >= 10)  else 0)
0        0
1        0
2        0
3    11.00
Name: c, dtype: object
 

Reference

 

파이썬 판다스 데이터프레임 apply함수 사용 - 특정 조건(if)의 값 바꾸기!

데이터 프레임을 가공하다 보면, 특정 조건에 맞는 값을 변경해야 될 경우가 있습니다. 이를 처리할 수 있는 방법은 여러 가지입니다. 하지만 그중에서도 코드를 깔끔하게 작성하고, 직관적으로

tariat.tistory.com

 

apply() vs map() vs applymap() in Pandas

Discussing the difference between apply(), map() and applymap() in Python and Pandas

towardsdatascience.com

 

[Pandas] 함수 적용하기(map,apply, applymap)

판다스 내에서 함수처리 하는 방법입니다. 파이썬으로 할 수 있지만 판다스 메쏘드로 간단한 함수를 정의할 수 있다는 게 큰 장점이고 메모리 절약도 할 수 있습니다. map, apply, applymap 세가지 메

seong6496.tistory.com

 

pandas.Series.map — pandas 1.5.0 documentation

If ‘ignore’, propagate NaN values, without passing them to the mapping correspondence.

pandas.pydata.org