1 분 소요

Pandas를 다루다 보면 한번쯤은 헷갈릴만한 map, apply, applymap 정리하기.

#hide
import pandas as pd

Map

Map values of Series according to an input mapping or function. Used for substituting each value in a Series with another value, that may be derived from a function, a dict or a Series. (출처: pandas doc)

Series 대상으로만 사용 가능하며, 주로 series내 값들을 다른 값들로 바꿔주는 데 사용한다.

df = pd.DataFrame({'name':['James', 'Hugh', 'Laurie'], 'age':[32, 18, 27], 'sex': ['male', 'male', 'female']})
df
name age sex
0 James 32 male
1 Hugh 18 male
2 Laurie 27 female
# DataFrame에 적용 불가능
try:
    df.map({'female': 0, 'male':1})
    df
except Exception as e:
    print(e)
'DataFrame' object has no attribute 'map'

매핑할 pair들은 dictionary꼴로 넣어주거나 함수, 또는 또다른 series로 넣어줄 수 있다.

# 1. dictionary
df['sex_converted'] = df['sex'].map({'female':0, 'male':1})
df
name age sex sex_converted
0 James 32 male 1
1 Hugh 18 male 1
2 Laurie 27 female 0
# 2. function
df['sex_converted'] = df['sex'].map(lambda x: 1 if x=='male' else 0)
df
name age sex sex_converted
0 James 32 male 1
1 Hugh 18 male 1
2 Laurie 27 female 0
# 3. series
mapping_series = pd.Series({'male':1, 'female':0})
df['sex_converted'] = df['sex'].map(mapping_series)
df
name age sex sex_converted
0 James 32 male 1
1 Hugh 18 male 1
2 Laurie 27 female 0

Apply

series에만 적용가능한 map과 달리, apply는 series/dataframe에 사용가능한 메소드이다.

apply는 map과 달리 지정해 주는 axis에 따라 주어진 함수를 적용한다. (axis=0이면 column, axis=1이면 row 대상) 따라서 map과 달리 apply는 지정된 axis를 따라 function를 적용할 수 있다.

df = pd.DataFrame({'name':['James', 'Hugh', 'Laurie'], 'age':[32, 18, 27], 'sex': ['male', 'male', 'female']})
df 
name age sex
0 James 32 male
1 Hugh 18 male
2 Laurie 27 female
new_df = df.apply( lambda x: x.sum() if x.dtype == 'int64' else x, axis=0)
new_df
name age sex
0 James 77 male
1 Hugh 77 male
2 Laurie 77 female

Applymap

Apply a function to a Dataframe elementwise. This method applies a function that accepts and returns a scalar to every element of a DataFrame.

applymap은 dataframe에서만 사용가능한 메소드이다. applymap은 apply와 달리 모든 element에 같은 함수를 적용하기 때문에 axis를 지정할 필요가 없다.

df = pd.DataFrame({'name':['James', 'Hugh', 'Laurie'], 'age':[32, 18, 27], 'sex': ['male', 'male', 'female']})
df 
name age sex
0 James 32 male
1 Hugh 18 male
2 Laurie 27 female
df.applymap(lambda x:len(str(x)))
name age sex
0 5 2 4
1 4 2 4
2 6 2 6

업데이트: