본문 바로가기
Language/파이썬

파이썬 '판다스 데이터 분석' - 데이터프레임에 함수 적용 .apply()

by javapp 자바앱 2021. 7. 25.
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

댓글