[29일차]DataFrame심화 - Series값 매핑(map)과 DataFrame요소 함수적용(applymap)

김준석·2024년 1월 4일

apply() 메소드 외에도 map() 메소드로 함수를 적용할 수 있다.

참고로 map() 함수는 파이썬의 map처럼 생각하면 안된다!

딕셔너리 형태로 사용되기 때문에 실습을 통해 더 자세히 알아보자.

실습 환경 구축

people_set = {
    'Name' : ['Spencer', 'Mark', 'Tom', 'Peter'],
    'Major': ['Computer', 'Science', 'English', 'Computer'],
    'YearOfJoining' : [2020, 2019, 2018, 2017],
    'DriverLicense' : [True, False, False, True],
    'TeacherCertification' : [True, False, False, False],
}

import pandas as pd

people = pd.DataFrame(people_set)
people


map() 으로 값 변환

DriverLicense 컬럼을 보면 아래와 같다.

이를 map() 메소드를 이용해 값을 변경해보자.

# map() 으로 매핑 확인해서 값 변환
people['DriverLicense'].map({True : 'Yes', False : 'No'})

매핑이 안된 값은 결측치 처리가 된다.

TeacherCertification 컬럼. 교사 자격이 있는지 없는지 확인하는 컬럼에서 True의 값만 변경해보자.

# 매핑이 안된 값은 그대로? NA? 일까
people['TeacherCertification'].map({True : "yes"})

그럼 False의 값은 결측치로 처리된다.

그렇기 때문에 결측치 발생을 막기 위해서는

map() 함수를 사용하기 전에 value_counts() 로 어떤 값들이 있는지 확인 후 변경을 해줘야 된다.

False 3개

True 1개가 있는 모습


applymap(func) 으로 값 변환

  • 데이터 프레임에서만 사용 가능
  • apply의 처리만 하는 형태 + map의 매핑의 형태
    -- 모든 컬럼에 대해 반환한다.

예를 들어 아래와 같이 컬럼 타입을 반환해보자.

먼저 컬럼 타입을 조회!

people.applymap(type)

그럼 데이터 프레임의 형태로 모든 컬럼 타입이 나옴!!

이를 어떤식으로 사용하나?

이전에 컬럼의 타입을 str 로 변경해서 관련 메소드를 사용한 경험을 했었다.

하지만 체인형으로 진행한다면 컬럼 하나 하나 밖에 변경을 못한다.
왜?? 시리즈만 변경 가능하기 때문.

이렇게 이름 컬럼을 str로 변환 후 길이를 재는 코드는 괜찮은데,

people['Name'].str.len()

전체 컬럼을(데이터 프레임) str로 전환할 때 아래와 같은 코드는 안됨.

people.str.len()

즉, 특수한 상황에서 모든 컬럼 타입을 변경할 때 .applymap() 을 사용하면 전체 타입을 변경할 수 있다.

타입을 다 str로 바꿈

people.applymap(str).applymap(type)

모든 값을 대문자로 바꿔보자

먼저 대문자를 만드는 함수를 만들어 준다.

# 대문자 만드는 함수
def uppercase(data):
    return data.upper()

이후 .applymap() 을 이용!

people.applymap(str).applymap(uppercase)


사실 형변환 기능은 .astype 으로도 할 수 있다.

모든 요소 형변환 하는 방법은 따로 있긴하다.

위에는 사용자가 함수를 만들어서 모든 요소에 적용할 수 있다는 점을 실습해본 것.


Lambda로 값을 변경할 수 있다.

# Lambda도 살펴보자
df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [4, 5, 6],
                   'C': [7, 8, 9]})

위와 같은 데이터 프레임이 있다고 할 때

df_squared = df.applymap(lambda x: x**2)

lambda 로 제곱값을 넣어주면

아래와 같이 변경 가능


위에서 배운 메소드로 캐글 데이터를 만져보자.

import pandas as pd

customers = pd.read_csv('marketing_campaign.csv', sep='\t', index_col='ID')
customers

1. 다자녀 표시

Kidhome 컬럼이 2개 이상이면 다자녀로 표시

0 = 자녀없음

1 = 외동

2 이상 다자녀

.map() 메소드를 이용해보자

customers['Kidhome'].map({0 : '자녀없음', 1 : '외동', 2 : '다자녀'})

이후 해당 컬럼을 추가!

customers['Kidhome'] = customers['Kidhome'].map({0 : '자녀없음', 1 : '외동', 2 : '다자녀'})

2. 모두 대문자로 변환

customers.astype(str).applymap(uppercase)

위 아래 둘다 같은 값을 가져옴

customers.applymap(str).applymap(uppercase)

0개의 댓글