본문 바로가기
Python notes/Data Science & Machine Learning

데이터전처리) Pandas로 각종 데이터 전처리 1탄 (+엑셀 불러오기/저장, 일부 행/열만 추출, 일부 행/열만 삭제, 데이터 수정/추가, 결측치 확인/삭제)

by 성실한 나무 2021. 11. 23.

 경기지역과 전남지역의 미세먼지를 비교하기 위한 데이터를 가공하면서 정리한 데이터전처리 방법들을 아래에 요약해 본다. 데이터 전처리는 파이썬의 pandas 패키지를 활용해서 진행하였다. 기본 파이썬 환경에서는 pandas 패키지가 제공되지 않고, 명령프롬프트 혹은 터미널에 pip install pandas 명령어를 실행함으로써 패키지를 설치해야 한다.

 

#1. 데이터 불러오기/저장하기:

  불러오기) read_excel('경기ndf.xlsx')

  저장하기) 데이터프레임객체.to_excel('파일명.xlsx')

 pandas의 read_excel 함수를 사용하기 위해서는 먼저 함수를 불러와야 한다. 코드는 from pandas import read_excel이다. 엑셀 파일로 전처리를 하는 경우 엑셀 관련 패키지도 설치하는 것이 좋다. (openpyxl, xlrd, xlwt) 엑셀 파일 버전에 따라 에러가 날 수도 있기 때문이다. 아래와 같이 read_excel("파일명.xlsx")로 엑셀 파일을 불러와서 데이터 프레임 형태로 객체에 저장을 할 수 있고, jupyter lab 환경에서는 객체명을 실행함으로써 데이터 내용을 확인할 수 있다.

 참고로, 데이터 전처리를 완료한 후에 해당 데이터프레임을 다시 엑셀 파일로 저장하려면, 추가 함수를 import할 필요 없이 데이터프레임 객체.to_excel("파일명.xlsx") 를 실행하면 된다. (*데이터프레임 객체= 이하 df객체) 그러면 파일명.xlsx로 저장된 엑세파일을 확인할 수 있을 것이다. 불러오고 저장할 때 파일 확장자까지 포함한다는 것과 파일명과 확장자까지 따옴표 찍는 것을 주의해야 한다.

pandas read_excel

 

#2. 일부 행/열만 추출:

  열만) df객체.filter(['열이름1', '열이름3', '열이름5', ...]) / df객체.iloc[ : , 시작인덱스:끝인덱스+1 ]

  행만) df객체[시작인덱스 : 끝인덱스-1] / df객체.iloc[ 시작인덱스:끝인덱스+1, : ] / df객체.loc['인덱스명']

 pandas의 데이터프레임 객체에서 일부 행/열만 추출하기 위해 사용하는 여러가지 함수들이 있는데 그 중에서 주로 쓰는 함수들을 요약해보았다. 전체 데이터 프레임에서 열의 순서와 상관없이 원하는 열만 골라서 추출할 경우, filter를 쓰고, 열의 순서 그대로 놓고 연속적으로 열을 추출하는 경우에는 iloc을 쓴다. 여기서 주의할 점은 filter함수는 괄호 안에 리스트 형태로 열을 입력해 주어야 한다는 점이고, iloc에서 " : "이 의미하는 바는 "all"이다. 즉, iloc[행, 열]을 의미하는데 행에 해당하는 부분은 전체 데이터를 가지고 오라는 의미에서 : 를 쓴다. iloc에서 데이터를 불러올 때 인덱스는 시작인덱스로부터 끝인덱스까지 불러오는 것이 아니라 끝인덱스의 바로 앞 데이터까지만 가져온다는 점을 주의해야 한다. 즉, 0:5인 경우 0번째부터 5번째 바로 앞 데이터인 4번째 열까지 데이터를 불러온다는 뜻이 된다. 동일한 원리로 행기준으로 데이터를 불러올 수가 있다.

 이렇게 추출된 데이터는 df객체에 바로 적용되는 것이 아니므로 새로운 객체명을 만들어서 거기에 할당해서 사용하면 된다.

 ex) 경기일부 = 경기.filter(['기간', '평균기온'])

pandas filter, iloc

 

#3. 일부 행/열만 삭제

  열만) df객체.drop(['삭제할열이름1', '삭제할열이름2'], axis=1)

  행만) df객체.drop( 삭제할행의 배열, axis=0)

 df객체에서 drop함수를 쓸 때, 행열의 방향을 정해서 원하는 데이터들을 삭제할 수 있다. axis는 축의 방향을 의미하는데 0은 x축(행방향), 1은 y축(열방향) 방향이다. 열의 경우, 삭제할 열이름을 리스트 형태로 나열해 주면 되고, 행의 경우, 삭제할 행의 인덱스를 리스트 형태로 나열해 주면 된다. 행의 경우, 아래와 같이 list(range(첫인덱스, 끝인덱스+1))로 숫자의 배열을 만들어서 적용할 수 있다. range 함수의 경우, 숫자의 간격도 조정할 수 있는데 예를 들면, 행에 적용할 파라미터를 list(range(0,10, 2))로 할 경우, 결과인 배열이 [0, 2, 4, 6, 8]로 나온다.

 inplace=True라는 파라미터를 추가로 입력하면 df객체 자체에 해당 함수가 적용되지만, 별도 객체로 만들어서 분리하는 것을 추천한다. 지우기 전 데이터가 필요한 경우가 있을 수 있기 때문이다.

dataframe drop axis

 

#4. 데이터 수정/추가:

 새로운 열에 값을 일괄적용하기) df객체['새로운 열'] = "일괄적용할값"

 일부값만 잘라내기) df객체.astype('str').str.slice(첫번째인덱스, 마지막인덱스+1)

 일부값을 변환하기) df객체.astype('str').str.replace('바꿀대상, '새로적용할내용')

 여기서는 일괄적으로 데이터프레임에 내용을 수정하고 추가하는 것을 다루려고 한다. 특정 조건에 따라 다른 값을 조회하는 것은 다음 포스팅에서 보충해야겠다.

 데이터가 경기지역의 데이터기 때문에 다른 지역의 데이터와 병합하기 전에 해당 데이터들의 지역 값이 '경기'임을 입력하는 과정이 필요하다. 이런 경우, df객체['지역'] = '경기'와 같이 '지역'이라는 새로운 열을 만들고 해당 열에 '경기'라는 값을 일괄적으로 적용할 수 있다.

 데이터에 있는 값들을 수정해서 적용하고 싶은 경우, df객체['해당열'] = df객체['해당열'].~수정작업~ 을 통해 적용할 수가 있다. 수정작업은 여러가지가 있지만 여기서는 slice와 replace를 정리해보았다. slice는 기존 데이터에서 일부만 가져오는 방법이고, replace는 기존 데이터에 있는 특정값을 다른 값으로 변경할 때 사용할 수 있다.

 

dataframe str.slice, str.replace

 

#5. 결측치 확인/삭제: df객체.isna().sum(), df객체.dropna(axis=0/1)  

 데이터 전처리에서 결측치를 확인하는 일이 중요하다. 파이썬 dataframe에서는 간단하게 결측치를 확인하고 제거할 수 있다. 결측치를 처리하는 방법으로 제거법 외에 대치법도 있는데 여기서는 삭제하는 것만 정리해본다.

 df객체.isna()를 하면, 결측치인 경우 True로 표시되고 나머지는 False로 표시된다. 그 상태에서 .sum()을 하게 되면 각 열의 결측치의 개수를 확인할 수 있다. 그리고 해당 결측치를 중심으로 x축 방향 혹은 y축 방향으로 행 혹은 열을 삭제하여 결측치가 없는 데이터프레임으로 전처리 할 수 있다.

dataframe isna, sum, dropna

 응용하면, 결측치가 겹치는 행들의 인덱스를 리스트로 추출해서 해당 인덱스의 행을 삭제할 수도 있다. isna()를 통해 df객체에 있는 결측치 True 값을 확인하고, 해당 열들의 값이 True인 결측인덱스를 아래와 같이 추출할 수 있다. 그러면 drop() 함수를 통해 결측치가 중복으로 있는 해당 행들을 한번에 삭제할 수 있다. (아래 NaN이 결측치이다. 난방LngAux와 난방바이오가스의 결측치가 겹치는 행은 인덱스가 4와 5이다) 

 

 

 각 케이스를 다루는 다른 방법들도 많이 있지만 일단 자주 사용하고 적용하기 쉬운 함수들로 정리해보았다. 여기서 다 다루지 못한 내용들은 다음 포스팅에서 보충하려고 한다. 데이터 병합(merge, concat 등), 조건에 따른 데이터 조회하는 법(query 등), 결측치 처리하는 법 (Imputation) 등을 다룰 예정이다.

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

댓글