기본 데이터
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를 통해 뒤의 함수 이름만 적어주면 됩니다!
감사합니다.
지적 환영합니다.
참고 : 나도코딩
'Python Library > Pandas' 카테고리의 다른 글
[Pandas - Python] Handling Missing Data (누락된 데이터 처리) (0) | 2022.06.13 |
---|---|
[Pandas - Python] Pandas 라이브러리와 그룹화 (0) | 2022.02.08 |
[Pandas - Python] Pandas 라이브러리와 데이터 수정(Column과 Row, Cell) (0) | 2022.02.07 |
[Pandas - Python] Pandas 라이브러리와 결측치 및 데이터 정렬(fillna, sort_values, sort_index) (0) | 2022.02.07 |
[Pandas - Python] Pandas 라이브러리와 데이터 검색(조건) (0) | 2022.02.07 |