데이터분석/파이썬

pandas 데이터 분석 4 - apply, map를 활용해서 컬럼 연산해보기

devbean 2021. 12. 5. 23:54
반응형

https://kbkb456.tistory.com/85

 

pandas 데이터 분석 3 - 데이터 합치기(merge, append, inner join, left outer join, right outer join, full outer join)

https://kbkb456.tistory.com/84 pandas 데이터 분석 2 - 데이터 프레임 슬라이싱(loc, iloc), 데이터 필터링(isin) https://kbkb456.tistory.com/76 pandas 데이터 분석 1 - csv, 엑셀파일, json을 데이터 프레임..

kbkb456.tistory.com

오늘은 apply와 map 함수를 통해서 칼럼을 연산하는 법에 대해서 알아보도록 하겠습니다.

 

1. series와 dataframe

apply와 map 함수를 설명하기 앞서 series와 dataframe에 대해서 간단하게 설명해보도록 하겠습니다.

 

- series : 컬럼 하나(1차원)로 이루어진 데이터를 series라고 합니다.

pandas series

- dataframe: 여러 개의 칼럼이 합쳐져서 행렬(2차원)로 이루어진 데이터를 dataframe이라고 합니다.

pandas dataframe

 

2. apply

apply함수는 1, 2차원 모두 사용가능한 데이터 처리 함수입니다.

행단 위, 열 단위 처리도 가능하고 특정한 한 가지 열을 처리하거나 추가할 수 있습니다. 

 

apply에서 어떤 연산 함수를 쓸 때는 numpy 라이브러리와 함께 써주면 좋습니다.

import numpy as np

 

문법

# axis 0 = 열단위 집계, 1 = 행단위 집계 
데이터프레임.apply(연산함수,axis = 0 or 1)

 

예시 데이터

apply 예시 데이터

 

해당 데이터에서 휴일, 야근, 수당에 대한 평균을 구하고 싶다고 생각해봅시다.

#np.average는 numpy의 평균 함수
df.apply(np.average,axis = 0)

이렇게 코드를 작성하면 에러를 발생시킵니다.

타입에러 발생!

왜냐면 이름 자체가 문자인데 문자를 평균 낼 수 없기 때문입니다. 그래서 원하는 칼럼을 가져온 뒤에 apply를 해봅시다.

 

코드 1

df[['휴일','야근','수당']].apply(np.average,axis = 0)

 

실행결과 1

pandas apply 1

axis를 0으로 해서 칼럼 단위로 평균을 내봤습니다. 그럼 1(행단 위)로 하면 어떻게 될까요?

 

코드 2

df[['휴일','야근','수당']].apply(np.average,axis = 1)

 

실행결과 2

pandas apply 2

axis를 1로 하니 각 행별로 휴일 + 야근 + 수당의 평균이 구해졌습니다.

 

내가 직접 만든 함수와도 연계가 가능하다.

 

휴일과 야근을 더하는 함수를 만들어서 데이터 프레임에 "휴일과 야근"이라는 칼럼을 추가하고 싶다고 생각해 봅시다.

그래서 아래와 같은 함수를 만들었습니다.

#휴일+야근
#여기서 df인자는 데이터프레임
def holiday_plus_overtime(df):
  return df['휴일'] + df['야근']

 

이걸 데이터 프레임에 어떻게 적용할 수 있을까요?

 

코드

df['휴일과야근']= df.apply(holiday_plus_overtime,axis=1)

 

실행결과

pandas apply 3

이런 식으로 연산한 결과를 데이터 프레임에 넣을 수 있습니다.

 

3. map

map은 1차원 열 단위로 특화된 함수입니다. 파이썬 리스트, pandas series에서 많이 활용됩니다. 리스트 혹은 series에 어떤 변화를 주고 싶거나 기존에 칼럼을 이용해서 데이터 프레임에 새로운 컬럼을 추가하고 싶을 때 활용됩니다.

 

문법

시리즈.map(lambda x : 원하는함수(x))

여기서 람다는 익명 함수로써 필요한 처리만 하고 사라지는 일시적인 함수라고 보시면 되겠습니다.

 

예시 데이터

map 예시 데이터

 

여기서 내가 야근이 2일 이상이면 "bad" 2일 미만이면 "good"이라는 함수를 만들어서 그에 해당하는 값을 "초과 야근 여부"라는 칼럼으로 넣어보겠습니다.

 

그래서 이런 함수를 만들었습니다.

#야근이 2일이상이면 bad, 2일 미만이면 good
def is_overtime(overtime):
    if overtime < 2:
      return "good"
    else:
      return "bad"

 

이걸 데이터 프레임에는 어떻게 적용할까요?

 

코드

df["초과야근여부"] = df['야근'].map(lambda x : is_overtime(x))

 

실행결과

pandas map

이런 식으로 처리가 가능합니다. 사실 map함수는 pandas가 아니라 파이썬의 고유 함수인데요. 이렇게 series와 잘 어울려서 자주 활용됩니다. 잘 활용하면 깔끔한 코딩을 가능하게 해주는 함수입니다.

 

https://colab.research.google.com/drive/1zO7mDkQUv3dbp7PiisXgjGR7V90dBRIc?usp=sharing 

 

pandas 샘플코드.ipynb

Colaboratory notebook

colab.research.google.com

반응형