기본적인 데이터
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. Column
- column 수정 (replace)
학교 column에서의 북산고를 산북고로 바꿔보겠습니다. 이때 딕셔너리 형태로 인자를 줘야합니다.
df['학교'].replace({'북산고':'산북고'})
지원번호
1번 산북고
2번 산북고
3번 산북고
4번 산북고
5번 산북고
6번 능남고
7번 능남고
8번 능남고
Name: 학교, dtype: object
혹은,
df['학교'].replace({'북산고':'산북고', '능남고':'경북고'})
지원번호
1번 산북고
2번 산북고
3번 산북고
4번 산북고
5번 산북고
6번 경북고
7번 경북고
8번 경북고
Name: 학교, dtype: object
이런 식으로 여러가지의 column의 value도 변경 가능합니다.
inplace 적용 가능합니다.
- column 수정 (str)
str처리를 해줘서 lower() 혹은 upper()도 사용 가능합니다.
df['SW특기'].str.lower()
지원번호
1번 python
2번 java
3번 javascript
4번 NaN
5번 NaN
6번 c
7번 python
8번 c#
Name: SW특기, dtype: object
업데이트가 되는 것은 아니니
df['SW특기'] = df['SW특기'].str.lower()
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이 모두 ~~고로 끝나는 모습입니다. 저는 ~~고등학교로 끝내고 싶으므로 모든 ~~고 뒤에 '등학교'를 넣어주겠습니다.
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#
이렇게 하시면 됩니다.
여기서 주의하셔야할 점이 지금 학교에 있는 ~~고가 string 형태라 +가 된 겁니다. 만약 키에 + 'cm'를 하시면 아마 오류를 낼 겁니다. 왜냐하면 키는 int형태이고 'cm'는 string 형태기 때문입니다.
위 문제는 밑에 함수 적용에서 해결할 수 있습니다.
- column 추가
'총합' 이라는 column을 만들어서 모든 과목의 합을 집어 넣겠습니다.
df['총합'] = df['국어'] + df['영어'] + df['수학'] + df['과학'] + df['사회']
df
이름 학교 키 국어 영어 수학 과학 사회 SW특기 총합
지원번호
1번 채치수 북산고등학교 197 90 85 100 95 85 PYTHON 455
2번 정대만 북산고등학교 184 40 35 50 55 25 JAVA 205
3번 송태섭 북산고등학교 168 80 75 70 80 75 JAVASCRIPT 380
4번 서태웅 북산고등학교 187 40 60 70 75 80 NaN 325
5번 강백호 북산고등학교 188 15 20 10 35 10 NaN 90
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465
간단하게 이렇게 해주면 그냥 '총합' column이 생성이 됩니다.
여기서 '결과' column을 하나 생성하고 'Fail'로 초기화하겠습니다.
df['결과'] = 'Fail'
df
이름 학교 키 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 북산고등학교 197 90 85 100 95 85 PYTHON 455 fail
2번 정대만 북산고등학교 184 40 35 50 55 25 JAVA 205 fail
3번 송태섭 북산고등학교 168 80 75 70 80 75 JAVASCRIPT 380 fail
4번 서태웅 북산고등학교 187 40 60 70 75 80 NaN 325 fail
5번 강백호 북산고등학교 188 15 20 10 35 10 NaN 90 fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 fail
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 fail
이렇게 해주면 됩니다.
제가 원하는 것은 총합이 400점 이상인 학생들의 결과를 Pass로 바꾸는 겁니다.
loc를 이용해서 바꿔줄 수 있습니다.
df.loc[df['총합'] >= 400, '결과'] = 'Pass'
df
이름 학교 키 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 북산고등학교 197 90 85 100 95 85 PYTHON 455 Pass
2번 정대만 북산고등학교 184 40 35 50 55 25 JAVA 205 Fail
3번 송태섭 북산고등학교 168 80 75 70 80 75 JAVASCRIPT 380 Fail
4번 서태웅 북산고등학교 187 40 60 70 75 80 NaN 325 Fail
5번 강백호 북산고등학교 188 15 20 10 35 10 NaN 90 Fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 Pass
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 Pass
이렇게 해주면 수정이 됩니다. 사실 위의 추가 작업 없이 이렇게만 작성해도 되긴합니다만, 그렇게 되면 fail이 아니라 NaN이 될겁니다.
- column 삭제
앞장에서 설명드린 drop을 이용하면 됩니다.
df.drop(columns = '총합')
이름 학교 키 국어 영어 수학 과학 사회 SW특기 결과
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python Pass
2번 정대만 북산고 184 40 35 50 55 25 Java Fail
3번 송태섭 북산고 168 80 75 70 80 75 Javascript Fail
4번 서태웅 북산고 187 40 60 70 75 80 NaN Fail
5번 강백호 북산고 188 15 20 10 35 10 NaN Fail
6번 변덕규 능남고 202 80 100 95 85 80 C Pass
7번 황태산 능남고 188 55 65 45 40 35 PYTHON Fail
8번 윤대협 능남고 190 100 85 90 95 95 C# Pass
여러 개의 column을 삭제하고 싶다면,
df.drop(columns = ['국어', '영어', '수학'])
이름 학교 키 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 북산고 197 95 85 Python 455 Pass
2번 정대만 북산고 184 55 25 Java 205 Fail
3번 송태섭 북산고 168 80 75 Javascript 380 Fail
4번 서태웅 북산고 187 75 80 NaN 325 Fail
5번 강백호 북산고 188 35 10 NaN 90 Fail
6번 변덕규 능남고 202 85 80 C 440 Pass
7번 황태산 능남고 188 40 35 PYTHON 240 Fail
8번 윤대협 능남고 190 95 95 C# 465 Pass
이렇게 리스트 형태로 넣으면 됩니다.
inplace를 통해 업데이트가 필요합니다.
2. Row
위의 column에서 value의 수정에 대해서 배웠으니, 여기서는 그냥 Row의 추가, 삭제만 알아보겠습니다.
- Row 추가
df.loc['9번'] = 'Fail'
df
이름 학교 키 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python 455 Pass
2번 정대만 북산고 184 40 35 50 55 25 Java 205 Fail
3번 송태섭 북산고 168 80 75 70 80 75 Javascript 380 Fail
4번 서태웅 북산고 187 40 60 70 75 80 NaN 325 Fail
5번 강백호 북산고 188 15 20 10 35 10 NaN 90 Fail
6번 변덕규 능남고 202 80 100 95 85 80 C 440 Pass
7번 황태산 능남고 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고 190 100 85 90 95 95 C# 465 Pass
9번 Fail Fail Fail Fail Fail Fail Fail Fail Fail Fail Fail
이렇게 해주시면 됩니다. 만약 값을 넣고 싶다면,
df.loc['9번'] = ['이정환', '해남고', 184, 90, 90, 90, 90, 90, 'Kotlin', 450, 'Pass']
df
이름 학교 키 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python 455 Pass
2번 정대만 북산고 184 40 35 50 55 25 Java 205 Fail
3번 송태섭 북산고 168 80 75 70 80 75 Javascript 380 Fail
4번 서태웅 북산고 187 40 60 70 75 80 NaN 325 Fail
5번 강백호 북산고 188 15 20 10 35 10 NaN 90 Fail
6번 변덕규 능남고 202 80 100 95 85 80 C 440 Pass
7번 황태산 능남고 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고 190 100 85 90 95 95 C# 465 Pass
9번 이정환 해남고 184 90 90 90 90 90 Kotlin 450 Pass
이렇게 하면 초기화가 가능합니다.
- Row 삭제
당연히
df.drop(index = '4번')
도 가능합니다.
하지만 이젠 조건에 따라 행을 삭제해보겠습니다.
filt = df['수학'] < 80
df.drop(index = df[filt].index)
이름 학교 키 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python 455 Pass
6번 변덕규 능남고 202 80 100 95 85 80 C 440 Pass
8번 윤대협 능남고 190 100 85 90 95 95 C# 465 Pass
9번 이정환 해남고 184 90 90 90 90 90 Kotlin 450 Pass
이렇게 조건에 따라 행을 삭제할 수도 있습니다.
이 경우에 inplace가 필요합니다.
3. Cell
- Cell 수정
df.loc['4번', 'SW특기'] = 'Python'
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 Python
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#
원래 데이터에는 4번의 SW특기가 NaN이었는데, Cell 수정을 통해 Python이 됐습니다.
또한, 여러가지의 Cell을 수정할 수 있습니다. 앞서 배운 loc를 활용하면 됩니다.
df.loc['5번', ['학교', 'SW특기']] = ['경북고', 'C']
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 Python
5번 강백호 경북고 188 15 20 10 35 10 C
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
이렇게 하면 5번의 학교와 SW특기가 모두 바뀌었습니다.
4. Column, Row(Index)의 순서 변경 및 이름 변경
위의 갯수 추가, 갯수 삭제와는 다릅니다. column 간의 순서를 변경하거나 이름을 변경하는 방법입니다.
- Column 순서 변경
저 위의 데이터에서 '결과'의 데이터가 있었습니다. 이때 결과 데이터를 맨 앞으로 가져오겠습니다.
cols = list(df.columns)
cols
['이름', '학교', '키', '국어', '영어', '수학', '과학', '사회', 'SW특기', '총합', '결과']
이렇게 나옵니다.
여기서 결과를 맨 앞으로 빼고, 나머지를 뒤로 밀어보겠습니다.
df = df[[cols[-1]] + cols[0:-1]] # cols[-1]는 리스트가 아니라 '결과'라는 값임, cols[0:-1]는 리스트임. 그래서 cols[-1]에 괄호를 쳐줘야함
df
결과 이름 학교 키 국어 영어 수학 과학 사회 SW특기 총합
지원번호
1번 Pass 채치수 북산고 197 90 85 100 95 85 Python 455
2번 NaN 정대만 북산고 184 40 35 50 55 25 Java 205
3번 NaN 송태섭 북산고 168 80 75 70 80 75 Javascript 380
4번 NaN 서태웅 북산고 187 40 60 70 75 80 Python 325
5번 NaN 강백호 경북고 188 15 20 10 35 10 C 90
6번 Pass 변덕규 능남고 202 80 100 95 85 80 C 440
7번 NaN 황태산 능남고 188 55 65 45 40 35 PYTHON 240
8번 Pass 윤대협 능남고 190 100 85 90 95 95 C# 465
이해가 잘 안 되시는 분들은 아래를 봐주세요.
df = df[['결과', '이름', '학교']] # 위에 Cell에 대한 보충 설명
df
결과 이름 학교
지원번호
1번 Pass 채치수 북산고
2번 NaN 정대만 북산고
3번 NaN 송태섭 북산고
4번 NaN 서태웅 북산고
5번 NaN 강백호 경북고
6번 Pass 변덕규 능남고
7번 NaN 황태산 능남고
8번 Pass 윤대협 능남고
비슷한 방식이라고 생각하시면 됩니다. 이렇게 순서를 바꿔봤습니다.
- Row 순서 변경
df.reindex(['1번', '3번', '4번', '5번', '6번', '7번', '2번'])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 Python
5번 강백호 경북고 188 15 20 10 35 10 C
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
2번 정대만 북산고 184 40 35 50 55 25 Java
이렇게 순서를 변경할 수 있습니다. 참고로 없어진 Row도 있는데, 이런 식으로 삭제도 가능하긴 합니다.
- Column과 Index의 이름 변경
column의 경우
df.columns = ['Result', 'Name', "School"]
df
Result Name School
지원번호
1번 Pass 채치수 북산고
2번 Fail 정대만 북산고
3번 Fail 송태섭 북산고
4번 Fail 서태웅 북산고
5번 Fail 강백호 북산고
6번 Pass 변덕규 능남고
7번 Fail 황태산 능남고
8번 Pass 윤대협 능남고
이렇게 가능합니다. 물론 이건 column이 '결과', '이름', '학교' 만 있을 때입니다. 갯수에 맞게 넣어야 합니다.
row도 동일한 방식으로 가능합니다.
또 다른 방법으로는 rename이 있습니다.
df.rename(columns = {'Result':'결과'})
결과 Name School
지원번호
1번 Pass 채치수 북산고
2번 Fail 정대만 북산고
3번 Fail 송태섭 북산고
4번 Fail 서태웅 북산고
5번 Fail 강백호 북산고
6번 Pass 변덕규 능남고
7번 Fail 황태산 능남고
8번 Pass 윤대협 능남고
이렇게 column를 바꿀 수 있고,
df.rename(index = {'1번':'123번'})
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
123번 채치수 북산고 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 Python
5번 강백호 경북고 188 15 20 10 35 10 C
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
이렇게 row도 바꿀 수 있습니다.
5. 요약
다양한 방식으로 column, row, cell의 데이터를 수정 및 추가, 삭제가 가능한데, 위의 방법을 잘 읽고, 자신에게 맞는 방법을 사용하면 될 것 같습니다.
추가는 그냥 뒤에 [] 이렇게 넣으면 되고, 삭제는 drop을 통해서하고, 수정은 replace를 통해서 하면 됩니다.
열과 행 자체의 이름 변경과 순서 변경은 rename 혹은 리스트 형태로 하면 됩니다.
함수 적용 apply는 다음 장에 적겠습니다.
감사합니다.
지적 환영합니다.
참고 : 나도코딩
'Python Library > Pandas' 카테고리의 다른 글
[Pandas - Python] Pandas 라이브러리와 그룹화 (0) | 2022.02.08 |
---|---|
[Pandas - Python] Pandas 라이브러리와 함수 적용 (0) | 2022.02.08 |
[Pandas - Python] Pandas 라이브러리와 결측치 및 데이터 정렬(fillna, sort_values, sort_index) (0) | 2022.02.07 |
[Pandas - Python] Pandas 라이브러리와 데이터 검색(조건) (0) | 2022.02.07 |
[Pandas - Python] Pandas 라이브러리와 데이터의 선택(loc, iloc) (0) | 2022.02.07 |