728x90
데이터프레임의 개별 원소를 특정 함수에 일대일 대응시키는 과정을 함수 매핑이라고 한다.
람다 함수를 포함하여 사용자 정의 함수를 적용할 수 있기 때문에 판다스 기본 함수로 처리하기 어려운 복잡한 연산을 데이터프레임 등 판다스 객체에 적용하는 것이 가능하다.
import seaborn as sns
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age','fare']]
df['ten'] = 10
df.head()
<결과>
age fare ten
0 22.0 7.2500 10
1 38.0 71.2833 10
2 26.0 7.9250 10
3 35.0 53.1000 10
4 35.0 8.0500 10
df.info()
<결과>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 age 714 non-null float64
1 fare 891 non-null float64
2 ten 891 non-null int64
3 add 714 non-null float64
dtypes: float64(3), int64(1)
memory usage: 28.0 KB
df.dropna(inplace=True)
데이터프레임의 열에 함수 매핑
모든 열이 하나씩 전달
.apply(func, axis=0) # default : axis =0
함수정의
def add_10(n):
return n+ 10
def add_two_obj(a,b):
return a + b
df_tmp_ = df.apply(add_10) # -> 데이터프레임 # 열이(시리즈) 매핑 하나씩 맵핑, default : axis = 0
print(df_tmp_.head(),end='\n\n')
df2 = df['age'].apply(add_10) # -> 시리즈
print(df2.head(),end='\n\n')
df3 = df['age'].apply(lambda x : add_10(x)) # -> 시리즈
print(df3.head(),end='\n\n')
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
0 32.0
1 48.0
2 36.0
3 45.0
4 45.0
Name: age, dtype: float64
0 32.0
1 48.0
2 36.0
3 45.0
4 45.0
Name: age, dtype: float64
데이터프레임의 개별 원소(하나하나)가 파라미터 값으로 매핑
.applymap(func)
df_map = df.applymap(add_10)
df_map.head()
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
데이터프레임 모든 행을 하나씩 전달
.apply(func, axis=1)
df['add'] = df.apply(lambda x : add_two_obj(x['age'], x['ten']), axis=1) # 하나의 열(시리즈)가 매핑, 한 행 - 여러 열 적용
df.head()
age fare ten add
0 22.0 7.2500 10 32.0
1 38.0 71.2833 10 48.0
2 26.0 7.9250 10 36.0
3 35.0 53.1000 10 45.0
4 35.0 8.0500 10 45.0
데이터프레임 객체에 함수 매핑
.pipe(func) -> retval
# 데이터프레임 객체 전체가 파라미터로 매핑
def missing_value(dataframe_):
return dataframe_.isnull()
result_df = df.pipe(missing_value)
print(type(result_df))
result_df.tail()
<class 'pandas.core.frame.DataFrame'>
age fare ten
886 False False False
887 False False False
888 True False False
889 False False False
890 False False False
def total_number_missing(df):
return df.isnull().sum()
result_df = df.pipe(total_number_missing)
print(type(result_df))
result_df.tail()
<class 'pandas.core.series.Series'>
age 177
fare 0
ten 0
dtype: int64
람다 (lambda) 와 컴프리헨션
df['age'].apply(lambda d : '미성년자' if d<=17 else ('청년' if 18<=d<=65 else '노인'))
df.iloc[310:313]
age fare ten add
387 청년 13.0 10 46.0
389 미성년자 12.0 10 27.0
390 청년 120.0 10 46.0
댓글