👩💻/pandas
3. 데이터프레임 응용(1)
글로랴
2021. 1. 31. 18:39
1️⃣ 함수 매핑
함수 매핑은 시리즈 또는 데이터프레임의 개별 원소를 특정 함수에 일대일 대응시키는 과정을 말한다.
사용자가 직접 만든 함수(lambda 함수 포함)를 적용할 수 있기 때문에, 판다스 기본 함수로 처리하기 어려운 복잡한 연산을 판다스 객체에 적용하는 것이 가능하다.
📢 Series객체 함수 매핑
📍 Series객체.apply(func)
시리즈 객체에 apply() 메소드를 적용하면, 매핑 함수에 시리즈의 모든 원소를 하나씩 인자로 전달한다.
리턴값으로 같은 시리즈 객체를 받는다.
예시)
# 사용자 정의 함수
def add_two_obj(a, b):
return a+b
# Series 객체와 숫자에 적용 : 2개의 인수(시리즈 + 숫자)
sr = df['age'].apply(add_two_obj, b=10)
📢 DataFrame객체에 함수 매핑
📍 DataFrame객체.apply(func, axis=0, raw=False, result_type=None, args=())
> 데이터프레임의 apply() 메소드를 적용하면 모든 '열' 또는 '행'을 하나씩 분리하여 매핑 함수의 인자로 Series 형태로 전달
- func : mapping function's name
- axis
- 0 또는 'index' : 각 '열'에 함수 적용
- 1 또는 'columns' : 각 '행'에 함수 적용
- raw
- False : 각 행 또는 열을 'Series' 객체로 함수에 전달
- True : ndarray객체로 함수에 전달
result_type
- 'expand': list와 같은 결과가 열로 바뀐다.
- 'reduce' : list와 같은 결과를 시리즈로 반환한다.
- 'broadcast' : 결과가 DataFrame의 원래 모양으로 반환되고 원래 인덱스와 열이 유지된다.
- None : 매핑 함수에 따라 반환되는 객체가 다르다.
args : Series / ndarray 외에 함수에 전달한 변수
예시)
# 데이터프레임의 각 '열'에 함수 매핑
# 데이터프레임에 apply(axis=0) 메소드를 적용하면 모든 열에 하나씩 분리하여 매핑 함수의 인자로 각 열(Series)이 전달된다.
# ☝ 시리즈를 입력받아 시리즈를 반환하는 missing_value(series) 함수
# 사용자 정의 함수
def missing_value(series): # 시리즈를 인자로 전달
return series.isnull() # boolen 시리즈를 반환
# DataFrame column에 apply 메소드 적용
result = df.apply(missing_value, axis=0)
print(result.head())
print(type(result)
# ✌ 시리즈의 최대값과 최소값의 차이를 계산하여 값을 반환하는 min_max(x) 함수
# 사용자 함수 정의
def min_max(x):
return x.max() - x.min()
# DataFrame column에 apply 메소드 적용
result = df.apply(min_max, axis=0)
print(result)
print(type(result)
☝의 결과)
<class 'pandas.core.frame.DataFrame'>
✌의 결과)
<class 'pandas.core.series.Series'>
> 💡 결론 🔥
>> 예제☝을 통해, 시리즈를 입력받고 시리즈를 반환하는 함수를 매핑하면, 데이터프레임을 반환한다는 것을 알 수 있다.
실제로 데이터프레임의 열을 매핑 함수에 전달하면 각 열의 리턴값은 시리즈 형태로 반환된다.
그리고 이 시리즈들이 하나의 데이터프레임으로 통합되는 과정을 거친다.
>> 예제✌는 시리즈를 입력받아 '하나의 값'을 반환하는 함수를 매핑하면 시리즈를 반환한다.
이를 통해, 데이터프레임의 각 열을 매핑 함수에 전달하면 각 열의 리턴값은 '하나의 값'으로 반환된다.
마지막으로 이 값들을 하나의 시리즈로 통합하는 과정을 거친다는 것을 알 수 있다.
# 데이터프레임의 각 '행'에 함수 매핑
# 데이터프레임의 2개 열에 적용
# x=df, a=df['age'], b=df['ten']
df['add'] = df.apply(lambda x: add_two_obj(x['age'], x['ten']), axis=1)
df.head()
결과)
📍 DataFrame객체.applymap(Func)
데이터프레임의 각 개별 원소에 특정 함수를 매핑한다.
리턴값으로 동일한 형태의 데이터프레임을 반환한다.
📍 DataFrame객체.pipe(func, args)
데이터프레임 전체를 하나로 보고, 함수를 전체에 매핑한다.
사용하는 함수가 변환하는 리턴값에 따라 반환하는 리턴값이 결정된다.
💡🚨 결론 🔥🔥
Input | Method | Output |
개별 원소 | apply | 단일 값, 시리즈 |
시리즈 객체 (Series, DataFrame 행 또는 열) |
단일 값, 시리즈, 데이터프레임 | |
데이터프레임 원소 | applymap | 데이터프레임 |
데이터프레임 객체 | pipe | 단일 값, 시리즈, 데이터프레임 |
반응형