카테고리 없음

Pandas DataFrame Map, Applymap, Apply 비교

세모아이 2022. 3. 4. 19:14

DataFrame 의 데이터들의 변환이 필요할때가 종종 있습니다.

이때 사용할 수 있는 함수는 Map, Apply, ApplyMap 이 있는데요.

각각의 차이점들에 대해서 알아보도록 하겠습니다.

 

Map, Apply, ApplyMap 은 기본적으로 DataFrame 안에 있는 모든 개별 데이터에 접근하면서 이를 변환합니다.

이들의 차이점은 DataFrame 의 타입이 Series 또는 DataFrame 에 따라 사용할 수 있는 함수가 다릅니다.

  Series DataFrame
Map o x
ApplyMap x o
Apply o o

 

1. map 은 Series 타입에 적용 가능한 반면, applymap  DataFrame 타입에 적용 가능하다. 

2. applySeries, DataFrame 타입에 모두 문법적으로 허용 가능하며, 1개의 컬럼일때 Map 을 대체하여 사용할 수도 있고, ApplyMap 을 대체하여서 사용 가능합니다.

 

아래 예제를 통해 확인해보도록 하겠습니다.


1. Map 

다음과 같은 날짜 속성을 가진 데이터 프레임이 있다고 가정할때, 연도를 추출하는 예제를 보도록 하겠습니다. 

def extract_year(row):
    return row.split('-')[0]

date_list = [{'date': '2000-06-27'},
         {'date': '2002-09-24'},
         {'date': '2005-12-20'}]

df = pd.DataFrame(date_list, columns = ['date'])

Map 함수를 사용하여서 date 컬럼에 함수를 적용하면, 년도를 추출할 수 있습니다.

df['year'] = df['date'].map(extract_year)

Map 함수는 함수 뿐만 아니라, Dictionary 를 넣어서도 변환이 가능합니다. 

특히나 범주형 변수를 변환할때 사용할 수 있습니다. 

l1 = [{'name': 'Tom', 'sex': "Male"},
      {'name': 'Sarah', 'sex': "Female"},
      {'name': 'Joy', 'sex': "Male"},
      {'name': 'Joy', 'sex': "Unknown"}]

df1 = pd.DataFrame(l1, columns = ['name', 'sex'])

df1.sex = df1.sex.map({"Male": 0, "Female": 1, "Unknown": 2})

2. ApplyMap 

하나의 컬럼에 대해서 컬럼값을 변경하고 싶을 때는 Map 을 사용하지만, DataFrame 전체의 데이터를 변경하고 싶을 때는 ApplyMap 을 사용합니다. 

 

아래의 예제에서 예측값과 라벨값의 소수점 아래 3자리까지 표시해보도록 하겠습니다.

data_list = [{'pred': 2.67767, 'label': 3.4367},
         {'pred': 2.67767, 'label': 5.44767},
         {'pred': 2.67767, 'label': 1.767}]

df = pd.DataFrame(data_list, columns = ['pred', 'label'])
def round_(data):
    return np.around(data, decimals=3)

df.applymap(round_)

3. Apply

위의 1, 2 번의 예제에서 map, applymap 에 대체 가능합니다.

df['year'] = df['date'].apply(extract_year)

Apply 함수에서는 Applymap 과 다르게 파라미터를 보내어 출력이 가능합니다. 

df.apply(np.around, decimals=3)