판다스 데이터프레임을 조작할 때, 내가 원하는 함수를 만드는 경우가 있다.
즉, def를 이용해 함수로 나타낸 코드의 return 값을 모든 데이터프레임에 적용할 수 있다는 것인데,
이럴 때 이용하는 것이 apply 함수이다.
리스트에서 map 함수가 있다면, 데이터프레임에는 apply 함수가 있다. map과 apply도 아래에서 간단히 살펴보자.
전체 데이터프레임이나 특정 칼럼 값을 일괄적으로 가공하는 게 더 빠르겠지만,
특정 조건을 걸어서 조금 더 복잡하게 데이터를 가공해야 할 때 lambda식과 결합하여
apply lambda를 이용하는 것이 좋다.
파이썬 Python list apply lambda x y 함수
먼저 lambda(람다) 함수에 대해서 먼저 알아보자.
lambda 함수는 함수명을 프로그래밍할 때, 사용자 정의 함수를 문법에 맞춰 작성하는 것보다 간단하게 해결할 수 있도록 한다.
예를 들어 a와 b의 값을 더하는 get_sum(a,b)라는 함수를 만들고, 결과를 출력하기 위해서는 아래와 같이 식을 작성해야 할 것이다. 함수명과 입력인자 부분, 가공하고 return 하는 부분이 필요하다.
def get_sum(a,b):
return a+b
print(get_sum(10,20))
만약 위 식을 lambda 식으로 바꾼다면 한 줄로 작성이 가능하다.
get_sum_lambda = lambda x,y : x+y
print(get_sum_lambda(10,20))
:를 기준으로 왼쪽에는 입력인자들을, 오른쪽에는 계산식(반환되는 return값)을 입력해주면 된다.
만약 여러 개의 입력인자들이 리스트 형태로 있을 경우, map을 이용해 한 번에 처리할 수 있다.
lambda 매개변수 1, 매개변수 2 : 공식, 매개변수 1, 매개변수 2와 같이 적어주면 된다.
a = [10,20,30]
b = [4,5,6]
sums = map(lambda x,y : x+y, a,b)
list(sums)
결괏값으로 [14,25,36]을 얻을 수 있다.
판다스 데이터프레임 Pandas apply (lambda) 활용
데이터프레임의 apply(lambda) 식은 똑같은 원리로 작동한다.
함수를 먼저 만든 다음 .apply(lambda x: 함수(변수))와 같은 식으로 적용할수 있을 것이다.
이렇게 lambda를 사용할 때, if나 else if, else는 이용이 불가능하지만
유일하게 이용할 수 있는 것이 if else문이며,한 가지만 유의해서 사용하면 된다.
바로 반환값1 if 조건식 else 반환값2 와 같은 형태로 작성해야 한다는 점이다.
나이를 예로 들자면, 18세 이하면 Child, 아니면 Adult로 값을 할당하기 위한 람다식의 작성은 아래와 같다.
lambda x : 'Child' if x<=18 else 'Adult'
Pandas lambda if else
이를 데이터프레임의 칼럼에 apply로 일괄 적용하고자 한다면, 코드는 이런 형태가 될 것이다.
데이터프레임명.apply(lambda x : x['칼럼명'] 반환값
if x['칼럼명'] 조건식
else x['칼럼명'] 반환값),
axis=1)
titanic 데이터의 Age 값을 4세 이하는 Baby, 5세~18세 이하는 Child, 나머지는 Adult로 분류하기 위해서는
아래의 두 방법을 이용할 수 있다. 앞으로 만나게 되는 데이터에 따라서 적절한 방법을 선택하여 코드를 작성하자!
#1. 바로 lambda식 이용하기. 간단하고 빠르지만, 조건을 많이 걸어야 하는 상황에는 부적합하다.
df['Age_cat1']=df['Age'].apply(lambda x:'Baby'
if x<=4
else ('Child'
if x<=18
else 'Adult'))
print(df['Age_cat1'].value_counts())
df[['Age','Age_cat1']].head()
#2. 함수 만들어서 lambda식 적용하기. 세분화된 분류가 필요한 경우 적절하다.
def Age_cat2(age):
cat2=''
if age<=4 : cat2= 'Baby'
elif age<=18 : cat2= 'Child'
else : cat2 = 'Adult'
return cat2
df['Age_cat2']=df['Age'].apply(lambda x : Age_cat2(x))
print(df['Age_cat2'].value_counts())
df[['Age','Age_cat2']].head()
위의 두 코드가 아래와 같이 똑같은 결과를 반환한다는 것을 확인할 수 있다.
'Data Science' 카테고리의 다른 글
[ScikitLearn] 사이킷런 분류 iris 품종 예측 (0) | 2022.09.30 |
---|---|
[ScikitLearn] 머신러닝 필수, scikitlearn 설치 및 사이킷런 버전 확인 (0) | 2022.09.30 |
비전공자 데이터분석 가능할까? 데이터시각화부터 시작하기 (0) | 2022.09.17 |
[Git] 초보가 자주 쓰는 필수 Git 명령어 모음 정리 (0) | 2022.09.11 |
[Pandas] 판다스 결측치 제거 대체 fillna(0) 간단히 응용하기 (0) | 2022.08.17 |
댓글