Python Library/Pandas

[Pandas - Python] Pandas 라이브러리와 데이터 수정(Column과 Row, Cell)

바보1 2022. 2. 7. 23:52

기본적인 데이터

 

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는 다음 장에 적겠습니다.

 

감사합니다.

 

지적 환영합니다.

 

 

 

참고 : 나도코딩