말랑말랑제리스타일

[Pandas]판다스 데이터 매핑 본문

프로그래밍/파이썬

[Pandas]판다스 데이터 매핑

제리제리 2022. 1. 19. 13:17

판다스에서 데이터를 필요한 데이터로 가공하거나 매핑하는 작업은 매우 중요합니다.

그리고 판다스에는 유용한 매핑 함수가 두개 있는데요.

바로 map()과 apply() 입니다. 지금부터 판다스의 매핑 방법 두가지를 알아보겠습니다.

1. map

map은 apply에 비해 보다 간단한 소스코드로 매핑할 수 있습니다.

간단한 예시로 살펴보겠습니다.

test_df_age_mean = test_df.Age.mean()
test_df.Age.map(lambda p : p - test_df_age_mean)

이와 같이 파이썬의 람다함수(익명함수) 기능을 이용해서 데이터를 매핑하게 되는데요

간단히 위 소스를 설명하면 test_df_age_mean이라는 변수에 Age 즉 나이의 mean 값(평균값)을 넣고

판다스의 데이터 매핑 함수인 map 내부에서 람다함수를 생성해 매핑해줍니다.

이 람다함수에 대해서 간단히 설명하면 "p:"이라고 되어있는 부분은 실제로 결과로 받을 부분이고 p - test_df_age_mean은 들어갈 값으로 p에 p - test_df_age_mean이라는 값을 할당하겠다 라는 의미입니다.

실제로 실행해보면 아래와같은 결과를 파이썬의 Series 데이터 타입으로 얻을 수 있습니다.

2. apply

apply 매핑 방법은 map에 비해 약간 복잡해 보입니다.

그리고 map이 Series를 반환하는것과 달리 apply로 데이터를 매핑하면 결과값으로 전체 DataFrame을 얻을 수 있습니다.

실제 소스코드부터 보겠습니다.

def remean_age(row):
  row.Age = row.Age - test_df_age_mean
  return row

test_df.apply(remean_age, axis = 'columns')

map과 동일하게 각 row.Age에 row.Age - test_df_age_mean 이라는 값을 할당해주는 remean_age라는 함수를 만들어줍니다.

그리고 apply 함수에서 방금 만든 remean_age를 호출해 데이터 매핑을 진행합니다.

여기서 axis = 'columns'라고 되어있는데 이부분은 columns 별로 순회하면서 데이터를 매핑해라는 의미이고 만약 이부분이 axis = 'index'라면 인덱스별로 순회하게 될것입니다.

결과는 이렇게 DataFrame으로 반환됩니다.

 

여기서 중요한 한가지가 있습니다 apply 또는 map을 사용하면 판다스의 해당 DataFrame 자체가 바뀌지는 않습니다.

단 새로운 Series 또는 DataFrame을 반환하기 때문에 받아주는 변수를 만들어준다면 새로운 Series나 DataFrame으로 사용이 가능합니다.

 

3. 암시적 매핑(연산자 이용)

판다스에서는 꼭 map과 apply 기능을 이용하지 않더라도 데이터 매핑이 가능합니다.

test_df_age_mean = test_df.Age.mean()
test_df.Age - test_df_age_mean

이런 간단한 연산자만으로 전체 데이터 각각에서 평균값을 빼주는 연산이 가능합니다.

test_df.Name + '-' + test_df.Embarked

또한 이런 방법으로 전체 DataFrame에서 두개의 필드를 합친 필드로 보여주는 것도 가능하죠.

단, 간단한 연산은 이런 방법이 쉬울지 몰라도 복잡한 연산이 들어간다면 apply나 map 같은 판다스의 데이터 매핑 함수를 사용하는 편이 훨씬 유리하게 작용할 것입니다.

반응형
Comments