반응형
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 |