python - pandas apply를 사용한 데이터 수정 with lambda

2024. 3. 12. 22:08Python

pandas를 사용해서 데이터를 다룰 때 구성된 데이터의 하나의 컬럼 데이터를 통째로 연산해야 하거나 변환해야하는 경우가 생기게 됩니다. 이때 사용하면 유용한 pandas 함수 apply를 알아봅시다

 

우선 데이터를 생성해 볼까요?

데이터 셋 생성

import pandas as pd

# 예제 데이터프레임 생성
data = {
    '이름': ['홍길동', '이순신', '박보영'],
    '나이': [25, 40, 33],
    '부모의 나이 평균': [55, 62, 63],
    '도시': ['서울', '부산', '대구']
}
df = pd.DataFrame(data)

 

DF

다음과 같은 테이블을 생성 했습니다. 여기서 처음 시도해 볼 것은 이 유저의 나이를 1씩 더하는 작업을 진행하게 될겁니다

단일 Column 수정 - 유저의 나이 한살씩 더하기

df["나이"] = df["나이"].apply(lambda age: age +1)

나이를 더한 df

하나의 컬럼을 대상으로 pandas의 apply함수를 통해서 해당 Column의 Row를 순환하여 각각 1씩 더하게 됩니다.

그럼 만약 두개의 Column을 더하거나 뭔가 둘의 조건을 비교해서 새로운 Column또는 기존의 Column을 변경하게 되는 경우는 어떻게 할까요?

 

CASE 1. 다중 Column 수정 - 부모의 나의 평균값과 유저의 나이 차이 구하기

df["나이치"] = df.apply(lambda data: data["부모의 나이 평균"] - data["나이"], axis=1)

나이차 계산 df

다음과 같이 "나이차" 라는 새로운 컬럼을 생성하면서 아까와 다르게 df의 특정컬럼을 지정하여 apply하지 않습니다. 이렇게 되면 Series형태로 row데이터가 순환하여 연산을 할 수 있게 됩니다.

(물론.. 그냥 빼도 되는것은 알고 있지만 예제를 위해서 이렇게 했습니다)

에러발생

그리고 다음과 같은 에러를 보게된다면 마지막에 넣은 param값인 axis가 꼭 Column에 걸려있는지 확인 바랍니다.

(진짜 컬럼이 없을수 있으니 그거는 ... 뭐 말씀안드려도 잘하실거라 믿습니다!)

 

CASE 2-1. 다중 Column수정 - 지역 조건에 따른 보조금 정하기(lambda를 직접 이용하기)

만약 지역이 서울이고 부모와 나이차이가 25세 이상 난다면 국가로부터 10만원을 받을 수 있다고 가정합시다. 그럼 Column "보조금 여부"를 생성하고 

보조금을 받을 수 있다면 YES,  없다면 NO를 표기해보도록 하겠습니다.

df["보조금 여부"] = df.apply(lambda subsidy: "YES" if subsidy["도시"] == '서울' and subsidy["나이차"] >= 25 else "NO", axis=1)

보조금 df

이런식으로 if 문을 직접 활용하여 적용도 가능합니다.

 

CASE 2-2. 다중 Column수정 - 지역 조건에 따른 보조금 정하기(lambda를 외부함수와 사용)

이번에는 lambda내부에 직접 로직을 구현하는게 아니라 만약 더 복잡한 로직이 필요하다면 다음과 같이 활용 할 수도 있습니다.

def subsidy_chaek(data):
    city = data["도시"]
    age_diff = data["나이차"]
    
    if city == '서울' and age_diff >= 25:
        return "YES"
    else:
        return "NO"

df["보조금 여부"] = df.apply(lambda data: subsidy_chaek(data), axis=1)
df

보조금 df 2

위 코드와같이 외부에 함수를 구성하고 이것을 lambda에서 데이터만 넘겨줘서 return값을 적용하는 방법입니다. 

 

CASE 2-3. 다중 Column수정 - 지역 조건에 따른 보조금 정하기(lambda없이 함수의 직접 사용)

def subsidy_chaek(data):
    city = data["도시"]
    age_diff = data["나이차"]
    
    if city == '서울' and age_diff >= 25:
        return "YES"
    else:
        return "NO"
    
df["보조금 여부"] = df.apply(subsidy_chaek, axis=1)
df

보조금 df 3

아까와 동일한 함수를 적용하는데 apply함수 내부에 내가 작성한 함수의 이름만 들어있습니다. 마찬가지로 Series를 해당 함수로 보내서 연산하는 방식으로 동작하게 됩니다.

 

이상 마칩니다.