Python Library/Pandas

[Pandas - Python] Pandas 라이브러리와 함수 적용

바보1 2022. 2. 8. 17:31

기본 데이터

import pandas as pd
df = pd.read_excel('score.xlsx', index_col = '지원번호')
df
	이름	학교	키	국어	영어	수학	과학	사회	SW특기
지원번호									
1번	채치수	북산고	197	90	85	100	95	85	Python
2번	정대만	북산고	184	40	35	50	55	25	Java
3번	송태섭	북산고	168	80	75	70	80	75	Javascript
4번	서태웅	북산고	187	40	60	70	75	80	NaN
5번	강백호	북산고	188	15	20	10	35	10	NaN
6번	변덕규	능남고	202	80	100	95	85	80	C
7번	황태산	능남고	188	55	65	45	40	35	PYTHON
8번	윤대협	능남고	190	100	85	90	95	95	C#

1. apply 함수

 

위의 데이터의 학교 column에 + '등학교'를 붙이면 어떻게 될까요?

 

df['학교'] += '등학교'
df
	이름	학교		키	국어	영어	수학	과학	사회	SW특기
지원번호									
1번	채치수	북산고등학교	197	90	85	100	95	85	Python
2번	정대만	북산고등학교	184	40	35	50	55	25	Java
3번	송태섭	북산고등학교	168	80	75	70	80	75	Javascript
4번	서태웅	북산고등학교	187	40	60	70	75	80	NaN
5번	강백호	북산고등학교	188	15	20	10	35	10	NaN
6번	변덕규	능남고등학교	202	80	100	95	85	80	C
7번	황태산	능남고등학교	188	55	65	45	40	35	PYTHON
8번	윤대협	능남고등학교	190	100	85	90	95	95	C#

이렇게 학교 column의 ~~고 뒤에 모두 '등학교'가 붙습니다.

 

이때 키 column에 'cm'를 붙이면 어떻게 될까요?

df['키'] += 'cm'
UFuncTypeError                            Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_12292/2750839072.py in <module>
----> 1 df['키'] += 'cm'

~\anaconda3\lib\site-packages\pandas\core\generic.py in __iadd__(self, other)
  10962     def __iadd__(self, other):
  10963         # error: Unsupported left operand type for + ("Type[NDFrame]")
> 10964         return self._inplace_method(other, type(self).__add__)  # type: ignore[operator]
  10965 
  10966     def __isub__(self, other):

~\anaconda3\lib\site-packages\pandas\core\generic.py in _inplace_method(self, other, op)
  10939         Wrap arithmetic method to operate inplace.
  10940         """
> 10941         result = op(self, other)
  10942 
  10943         if (

~\anaconda3\lib\site-packages\pandas\core\ops\common.py in new_method(self, other)
     67         other = item_from_zerodim(other)
     68 
---> 69         return method(self, other)
     70 
     71     return new_method

이렇게 오류가 뜹니다. 타입 에러네요. 

 

왜냐하면 키는 정수고 'cm'는 string이기 때문에 +가 안 됩니다.


  • apply 적용

키에 string인 'cm'를 추가하고 싶으면 키를 string으로 형 변환을 해줘야합니다.

 

이때, 일일이 다 형변환하는 것보다 함수를 만들어서 하는게 더 편하므로, 함수를 만들어 보겠습니다.

 

def add_cm(height):
    return str(height) + 'cm'

그러면 이 함수를 적용해야하는데, 일일이 적용해보겠습니다.

 

for i in range(1,9):
    df.loc['{}번'.format(i), '키'] = add_cm(df.loc['{}번'.format(i), '키'])

이렇게 하면 1번 index부터 8번 index까지 잘 되지만, 뭔가 불편해보이죠??

 

이때 쓸 수 있는 apply라는 함수가 있습니다.

 

df['키'] = df['키'].apply(add_cm) # 키 데이터에 대해서 add_cm 함수를 호출한 결과 데이터를 반영
df
	이름	학교	키	국어	영어	수학	과학	사회	SW특기
지원번호									
1번	채치수	북산고등학교	197cm	90	85	100	95	85	Python
2번	정대만	북산고등학교	184cm	40	35	50	55	25	Java
3번	송태섭	북산고등학교	168cm	80	75	70	80	75	Javascript
4번	서태웅	북산고등학교	187cm	40	60	70	75	80	NaN
5번	강백호	북산고등학교	188cm	15	20	10	35	10	NaN
6번	변덕규	능남고등학교	202cm	80	100	95	85	80	C
7번	황태산	능남고등학교	188cm	55	65	45	40	35	PYTHON
8번	윤대협	능남고등학교	190cm	100	85	90	95	95	C#

이렇게 하면 간단히 해당 column의 데이터에 함수를 적용해줍니다.

 

다른 예시로,

def capitalize(lang): # 만든거
    if pd.notnull(lang): # NaN이 아닌지
        return lang.capitalize() # 이건 문자열에서 제공하는 함수임, 첫 문자는 대문자로 나머지는 소문자로
    return lang

df['SW특기'] = df['SW특기'].apply(capitalize)
df
	이름	학교	키	국어	영어	수학	과학	사회	SW특기
지원번호									
1번	채치수	북산고등학교	197cm	90	85	100	95	85	Python
2번	정대만	북산고등학교	184cm	40	35	50	55	25	Java
3번	송태섭	북산고등학교	168cm	80	75	70	80	75	Javascript
4번	서태웅	북산고등학교	187cm	40	60	70	75	80	NaN
5번	강백호	북산고등학교	188cm	15	20	10	35	10	NaN
6번	변덕규	능남고등학교	202cm	80	100	95	85	80	C
7번	황태산	능남고등학교	188cm	55	65	45	40	35	Python
8번	윤대협	능남고등학교	190cm	100	85	90	95	95	C#

이렇게 앞 문자만 대문자로, 뒤에 문자는 소문자로 만들어줍니다. (NaN 데이터를 제외하고)

 

참고로 loc를 이용해서 index(row)도 가능합니다!


  • str

 

df['SW특기'].str.capitalize()
df
	이름	학교	키	국어	영어	수학	과학	사회	SW특기
지원번호									
1번	채치수	북산고등학교	197cm	90	85	100	95	85	Python
2번	정대만	북산고등학교	184cm	40	35	50	55	25	Java
3번	송태섭	북산고등학교	168cm	80	75	70	80	75	Javascript
4번	서태웅	북산고등학교	187cm	40	60	70	75	80	NaN
5번	강백호	북산고등학교	188cm	15	20	10	35	10	NaN
6번	변덕규	능남고등학교	202cm	80	100	95	85	80	C
7번	황태산	능남고등학교	188cm	55	65	45	40	35	Python
8번	윤대협	능남고등학교	190cm	100	85	90	95	95	C#

다른 예시로 앞에서 했었던 str 함수가 있습니다.


2. 요약

 

일일이 for문을 이용할 필요 없이 전체 행이나 열에 함수를 적용할 수 있습니다.

 

apply를 통해 뒤의 함수 이름만 적어주면 됩니다!

 

감사합니다.

 

지적 환영합니다.

 

 

 

참고 : 나도코딩