Data Engineering/Python

[Python] 다양한 함수를 활용하여 파생변수(새로운 컬럼) 만들기(apply, map, lambda)

YSY^ 2021. 11. 28. 19:06

데이터프레임에 메소드를 적용하여 새로운 컬럼을 만드는 방법을 알아보겠습니다.

물론 반복문을 사용해서 데이터프레임에서 한줄씩 읽어와서 처리한 다음 컬럼을 만드는 방법도 있지만 이러한 방법은 시간이 오래걸린다는 단점이 있습니다.

따라서 함수를 활용해서 데이터프레임을 가공하는 여러가지 방법을 알아보겠습니다.

데이터프레임은 아래 예시 데이터를 활용하였습니다.

 

# 사전 세팅코드
import pandas as pd
data = pd.read_csv("data.csv")

 

하나의 컬럼만 활용하여 하나의 새로운 컬럼을 만들때

  • apply나 map 함수 활용

- 예시 : referrer에서 media(ex. naver, daum)을 뽑아내는 메소드를 적용시켜보겠습니다.

# 적용 함수
def split_data(referrer):
    media = referrer.split("/")[2].split(".")[1]
    return media
# apply 함수 적용
data["media"] = data["referrer"].apply(split_data)
# map 함수 적용
data["media"] = data["referrer"].map(split_data)

위 두 코드 모두 apply나 map에 함수를 그대로 적용시켜줍니다.

위 두 코드의 결과는 아래와 같습니다.

 

조건을 바로 적용하여 새로운 컬럼을 만들고 싶은 경우

  • apply, lambda 적용

- 예시 : referrer에서 "naver"의 개수 세기

data["naver"] = data["referrer"].apply(lambda x : x.count("naver"))

lambda를 활용하여 "naver"의 개수를 count하는 함수를 바로 적용시켜줍니다.

결과는 아래와 같습니다.

 

두개 이상의 컬럼을 활용하여 하나의 새로운 컬럼을 만들 때

  • Apply, lambda 활용

- 예시 : referrer와 url에서 동시에 media(ex. naver, daum)을 뽑아내는 메소드를 적용시켜보겠습니다.

# 적용 함수
def split_data_2(referrer, url):
    media = referrer.split("/")[2].split(".")[1]
    media2 = url.split("/")[2].split(".")[1]
    return media, media2
data["media_list"] = data.apply(lambda x : split_data_2(x["referrer"], x["url"]), axis=1)

lambda를 활용하여 컬럼들을 직접 함수에 넣어줍니다. axis=1 을 지정해 주어야 컬럼단위로 적용됩니다.

결과는 아래와 같습니다.

 

하나의 컬럼을 활용하여 여러개의 새로운 컬럼을 만들 때

  • apply, zip, lambda 함수 활용

- 예시 : referrer 컬럼을 "/"로 나눈 후 구성요소들을 활용하여 source, path1, path2 컬럼을 만들어보겠습니다.

def split_data_3(referrer):
    source = referrer.split("/")[2]
    path1 = referrer.split("/")[3]
    path2 = referrer.split("/")[4]
    return source, path1, path2
data['source'], data['path1'], data['path2'] = zip(*data['referrer'].apply(lambda x : split_data_3(x)))

zip 함수는 동일한 개수로 이루어진 자료형을 묶어주는 역할을 하는데, 몇개의 요소가 들어올지 모르므로 *args을 적용하여 그 안의 요소값들을 각각의 변수로 인식시키도록 한다.

결과는 아래와 같습니다.

728x90
반응형