Python

[Python] Function Mapping

SangRok Jung 2022. 10. 6. 12:09
반응형

Function Mapping (함수 매핑)


시리즈 또는 데이터 프레임의 개별 원소를 특정 함수에 1:1 대응시키는 과정

  • 사용자가 직접 만든 함수를 적용.
  • 판다스 기본 함수로 처리하기 어려운 복잡한 연산을 처리.

 

 

 

▷ apply() VS applymap()

  • applymap() 은 시리즈 객체를 사용할 수 없습니다.
  • 다수의 컬럼의 원소를 처리 할 때 applymap()이 빠르나 체감할 정도는 아닙니다.
  • 시리즈 객체의 데이터를 처리 할 때 apply()를 사용 할 수 있습니다.

* apply() 사용을 권장합니다.

 

 

 

 

 

▶ 새로운 데이터 프레임을 생성합니다.

titanic2 = titanic.loc[:, ['age', 'fare']]
titanic2['ten'] = 10

 

 

 

▶ 함수를 생성합니다.

add_10 = lambda n : n+10

add_two_obj = lambda a, b : a+b

 

 

 

▶ apply()로 각 원소를 더합니다.

  • 인자의 함수값이 적용됩니다.
  • 시리즈일 때 사용합니다.
sr1 = titanic2.age.apply(add_10)
sr2 = titanic2.age.apply(add_two_obj, b=10)
sr3 = titanic2.age.apply(lambda x : add_10(x))

print(sr1, "\n") 
print(sr2, "\n")
print(sr3)

# 0      32.0
# 1      48.0
# 2      36.0
# 3      45.0
# 4      45.0
#        ... 
# 886    37.0
# 887    29.0
# 888     NaN
# 889    36.0
# 890    42.0
# Name: age, Length: 891, dtype: float64

 

 

 

 

▶ applymap() 으로 모든 컬럼의 요소를 더합니다.

sr1 = titanic2.applymap(add_10) #기본 함수
sr2 = titanic2.applymap(add_two_obj, b=10) # 파라미터 입력
sr3 = titanic2.applymap(lambda x : add_10(x)) # 람다

print(sr1, "\n") 
print(sr2, "\n")
print(sr3)

#       age     fare  ten
# 0    32.0  17.2500   20
# 1    48.0  81.2833   20
# 2    36.0  17.9250   20
# 3    45.0  63.1000   20
# 4    45.0  18.0500   20
# ..    ...      ...  ...
# 886  37.0  23.0000   20
# 887  29.0  40.0000   20
# 888   NaN  33.4500   20
# 889  36.0  40.0000   20
# 890  42.0  17.7500   20

# [891 rows x 3 columns]

 

 

 

 

 

▶ 데이터 프레임의 각 컬럼에 함수 mapping

  • 모든 컬럼을 하나씩 분리하여 매핑 함수의 인자로 각 컬럼이 전달됩니다.
  • 데이터프레임의 컬럼은 매핑함수로 각각 시리즈 형태로 반환된 후 하나의 데이터 프레임으로 통합됩니다.
DataFram.apply(함수, axis=0)

 

 

▷ 데이터 프레임 생성

df = sns.load_dataset("titanic").loc[:, ["age", "fare"]]
df["ten"] = 10

 

 

▷ 시리즈를 인수로 받아서 null값의 여부를 반환하는 함수 정의

def missing_value(se) :
    return se.isnull()

 

▷  apply()를 실행합니다.

  • 데이터 프레임의 각 컬럼을 인수로 전달하면 데이터 프레임을 반환
df.apply(missing_value)

# age      False
# fare     False
# ten      False
# dtype: bool

 

▷ (같은 예문)

# 최대값 - 최소값
def min_max(x):
    return x.max() - x.min()

df.apply(min_max)

# age      79.5800
# fare    512.3292
# ten       0.0000
# dtype: float64

 

 

 

▶ apply()에 lambda 함수를 이용하여 인덱스와 컬럼을 추가합니다.

# 인덱스 하단에 추가
df.loc['total'] = df.apply(lambda x : x.sum()) 
df.loc['avg'] = df.apply(lambda x : x.mean())

# 컬럼에 추가
df['total'] = df.apply(lambda x : x.sum(), axis=1) 
df['avg'] = df.apply(lambda x : x.mean(), axis=1)

 

 

 

 

 

 

 

 

 

▶ pipe()

  • 매핑함수가 반환하는 리턴값에 따라 pipe 메서드가 반환하는 객체의 종류가 결정됩니다.
  • 데이터프레임 반환, 시리즈 반환, 개별 값 반환에 사용.
  • apply(), applymap()과 고려 했을 시 가장 문제점이 적습니다.
  • axis의 옵션이 없습니다.
  • axis 이슈 발생시 apply()사용을 권장합니다.

 

 

 

▷ 구문

DateFrame.pipe(f1, args).pipe(f2, arge).pipe(f3, args)

 

 

 

▷ 예문

df.age.pipe(min_max)
# 21204.75
반응형

'Python' 카테고리의 다른 글

[Python] 컬럼 순서 변경  (0) 2022.10.06
[Python] DataFrame  (0) 2022.10.06
[Python] TimeSeries  (0) 2022.10.06
[Python] 정규화  (0) 2022.10.06
[Python] 데이터 사전처리  (0) 2022.10.01