Snoopy [Python] Pandas - 18. map(), apply(), applymap()
Python/Pandas

[Python] Pandas - 18. map(), apply(), applymap()

Sooyoon Jeong 2023. 11. 13.

map, apply, applymap은 pandas에서 일괄적으로 값을 변경할 때 이용하는 함수로 다음과 같은 차이가 있다.

 

  • apply(): 데이터프레임(DataFrame)과 시리즈(Series)에 모두 적용 가능
  • map(): 시리즈(Series)에만 적용 가능
  • applymap(): 데이터프레임(DataFrame)에만 적용 가능

 

[문제 출처] 

https://www.datamanim.com/dataset/99_pandas/pandasMain.html#time-series

 

1. map

(1) 시리즈 기본 형태

df2 = df["컬럼명"].apply(lambda x:x/2)

 

(2) 문제 풀이 예

Q. Income_Category의 카테고리를 apply 함수를 이용하여 다음과 같이 변경하여 newIncome 컬럼에 매핑하라

dic = {
        'Unknown'        : 'N',
        'Less than $40K' : 'a',
        '$40K - $60K'    : 'b',
        '$60K - $80K'    : 'c',
        '$80K - $120K'   : 'd',
        '$120K +'        : 'e'   
        }

df4["newIncome"] = df4["Income_Category"].map(lambda x:dic[x])
ans = df4.newIncome
ans.head()

* 딕셔너리에서는 key값으로 value 를 부를 수 있다.

 

Q. Education_Level의 값중 Graduate단어가 포함되는 값은 1 그렇지 않은 경우에는 0으로 변경하여 newEduLevel 컬럼을 정의하고 빈도수를 출력하라

df4["newEduLevel"] = df4.Education_Level.map(lambda x: 1 if 'Graduate' in x else 0)
ans = df4["newEduLevel"].value_counts()
ans

 

Q. Gender 컬럼값 M인 경우 male F인 경우 female로 값을 변경하여 Gender 컬럼에 새롭게 정의하라. 각 value의 빈도를 출력하라

def gender(x):
    if x == "M":
        return "male"
    else:
        return "female"

df4["Gender"] = df4["Gender"].map(gender)
df4["Gender"].value_counts()

2. apply

(1) 데이터프레임 기본 형태

df1 = df.apply(lambda x:x/2)

 

(2) 시리즈 기본형태

df2 = df["컬럼명"].apply(lambda x:x/2)

 

(3) 문제 풀이 예

Income_Category의 카테고리를 apply 함수를 이용하여 다음과 같이 변경하여 newIncome 컬럼에 매핑하라

def changeCategory(x):
    if x =='Unknown':
        return 'N'
    elif x =='Less than $40K':
        return 'a'
    elif x =='$40K - $60K':   
        return 'b'
    elif x =='$60K - $80K':    
        return 'c'
    elif x =='$80K - $120K':   
        return 'd'
    elif x =='$120K +' :     
        return 'e'
    
# 시리즈

df4["newIncome"] = df4.Income_Category.apply(changeCategory)
ans = df4["newIncome"]
ans.head()
def age_pclass(cols):
    Age = cols[0]
    Pclass = cols[1]
    
    if pd.isnull(Age):
        if Pclass == 1: return 38
        elif Pclass = 2: return 29
        else: return 25
    else: return Age
 
# 데이터 프레임

train["Age"] = train[["Age", "Pclass"]].apply(age_pclass, axis = 1)

 

Q. Marital_Status 컬럼값이 Married 이고 Card_Category 컬럼의 값이 Platinum인 경우 1 그외의 경우에는 모두 0으로 하는 newState컬럼을 정의하라. newState의 각 값들의 빈도수를 출력하라

def function(x):
    if x.Marital_Status == "Married" and x.Card_Category == "Platinum":
        return 1
    else:
        return 0
    
df["newState"] = df4.apply(function, axis = 1)
df["newState"].value_counts()

?? axis = 1을 지정안하면 오류가 나는데 그 이유는 무엇일까?

 

3. applymap

(1) 데이터프레임 기본 형태

df1 = df.apply(lambda x:x/2)

 


참고

https://data-make.tistory.com/123

[파이썬] 판다스(pandas) 팁40. apply(), map(), applymap() 함수의 적용 대상과 차이점 : 네이버 블로그 (naver.com)

댓글