반응형
Notice
Recent Posts
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Today
Total
관리 메뉴

오식랜드

[python] pandas 데이터 수정 본문

dev-log/python

[python] pandas 데이터 수정

개발하는 오식이 2023. 1. 17. 18:33
반응형

출처 : 나도코딩 https://www.youtube.com/watch?v=PjhlUzp_cU0&t=10533

import pandas as pd

# excel 파일 열기
df = pd.read_excel('score.xlsx', index_col='지원번호')
print(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 수정

  • 하나의 데이터 수정

위의 데이터에서 ‘학교’중 ‘북산고’가 학교 이름이 바뀌었다고 하자

print(df['학교'].replace({'북산고' : '상북고'}))
지원번호
1번    상북고
2번    상북고
3번    상북고
4번    상북고
5번    상북고
6번    능남고
7번    능남고
8번    능남고
Name: 학교, dtype: object
  • 여러개 데이터 수정

이번에는 북산고와 능남고 둘 다 이름이 바뀌었다고 하자

그럴 땐 중괄호{} 안에서 컴마(,)로 나열해주면 된다

print(df['학교'].replace({'북산고' : '상북고', '능남고' : '바뀐고'}, inplace=True))
지원번호
1번    상북고
2번    상북고
3번    상북고
4번    상북고
5번    상북고
6번    바뀐고
7번    바뀐고
8번    바뀐고
Name: 학교, dtype: object
  • 모든 데이터 바꾸기

SW특기를 모두 소문자로 바꿔보자

df['SW특기'] = df['SW특기'].str.lower()
print(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#
  • 모든 데이터에 글자 추가

학교 col의 ‘ㅁㅁ고’를 ‘ㅁㅁ고등학교’로 바꿔보자

df['학교'] = df['학교'] + '등학교'
print(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['국어'] + df['영어'] + df['수학'] + df['사회'] + df['과학']
print(df)
       이름      학교       키   국어  ...  과학  사회  SW특기  총합
지원번호                         ...
1번    채치수  북산고등학교  197   90  ...  95  85      python  455
2번    정대만  북산고등학교  184   40  ...  55  25        java  205
3번    송태섭  북산고등학교  168   80  ...  80  75  javascript  380
4번    서태웅  북산고등학교  187   40  ...  75  80         NaN  325
5번    강백호  북산고등학교  188   15  ...  35  10         NaN   90
6번    변덕규  능남고등학교  202   80  ...  85  80           c  440
7번    황태산  능남고등학교  188   55  ...  40  35      python  240
8번    윤대협  능남고등학교  190  100  ...  95  95          c#  465

[8 rows x 10 columns]

이번에는 총합이 400점 이상인 학생은 합격, 400점 미만인 학생은 불합격으로 결과col을 추가해주자

우선 모두에게 동일하게 ‘불합격’을 넣으면서 ‘결과’ col으르 추가해준다

df['결과'] = '불합격'

그 이후에, loc을 이용해서 총합이 400이상인 row를 선택해주고,

그 row 중 ‘결과’ col의 값을 변경해준다

df.loc[df['총합'] >= 400, '결과'] = '합격'

추가한 결과

       이름    학교          키   국어  ...  사회   SW특기  총합  결과
지원번호                         ...

1번    채치수  북산고등학교  197   90  ...  85      python  455   합격
2번    정대만  북산고등학교  184   40  ...  25        java  205  불합격
3번    송태섭  북산고등학교  168   80  ...  75  javascript  380  불합격
4번    서태웅  북산고등학교  187   40  ...  80         NaN  325  불합격
5번    강백호  북산고등학교  188   15  ...  10         NaN   90  불합격
6번    변덕규  능남고등학교  202   80  ...  80           c  440   합격
7번    황태산  능남고등학교  188   55  ...  35      python  240  불합격
8번    윤대협  능남고등학교  190  100  ...  95          c#  465   합격

Column 삭제

  • 하나의 col 삭제

이제 더이상 ‘총합’은 필요가 없어서 삭제를 할 때 이렇게 적으면 된다

df.drop(columns=['총합'])
  • 2개 이상의 col 삭제
df.drop(columns=['과학', '사회'])

inplace가 필요하다!

Row 삭제

row를 삭제할 땐, drop함수에서 columns 대신 index로 사용하면 된다.

df.drop(index=['4번'])

조건에 따라 삭제

위의 데이터에서 수학 점수가 80점 미만인 학생의 데이터를 지우고싶다.

그럴 땐 우선 조건이 들어간 filter를 만들고, 그 조건에 해당하는 index를 출력해보자

filt = df['수학'] < 80
target = df[filt].index
print(target)

# Index(['2번', '3번', '4번', '5번', '7번'], dtype='object', name='지원번호')

그리고 그 list를 drop에 넣어주면 된다.

df.drop(index=target)

Row 추가

새로운 row를 추가할 때에는 loc로 추가가 가능하다

df.loc['9번'] = ['이정환', '해남고등학교', 184, 90, 90, 90, 90, 90, 'Kotlin', 450, '합격']

Cell 수정

  • 하나의 데이터 수정
df.loc['4번', 'SW특기'] = 'Python'
  • 2개 이상의 데이터 수정
df.loc['5번', ['학교','SW특기']] = ['능남고등학교', 'C']

Column 순서 변경

현재 col 확인하기

cols = list(df.columns)
print(cols)

# ['이름', '학교', '키', '국어', '영어', '수학', '과학', '사회', 'SW특기', '총합', '결과']
# cols[-1] : 맨 뒤의 col 선택
# cols[0: -1] : 맨 앞부터 마지막 하나 전까지 col 선택

# 합치기
df = df[[cols[-1] + cols[0: -1]]]

Column 이름 변경

df.colums에 list를 할당해주면 변경된다

df.columns = ['Name', 'School', 'Height', ...]
반응형
Comments