본문 바로가기
자료분석 및 코딩/파이썬

[파이썬] 4-1. 조위 자료 분석 (2) - dataframe의 칼럼명/열이름/헤더 수정 rename, 결측값 숫자변환

by 아다콘다 2023. 4. 12.

지난번 글에서는 판다스(pandas)의 read_csv를 활용해 데이터를 읽어오는 부분까지 진행했었다. 오늘은 읽은 데이터 중 특정 열을 뽑아내서 분석하기 위한 전 단계인 데이터 추출 및 칼럼명(헤더) 수정, 문자열의 숫자변환 등에 대해 설명해보도록 하겠다.

 

1. columns 이름 수정 (칼럼명, 헤더 수정)

 지난번에 pandas의 read_csv로 읽은 데이터는 아래와 같다. 전체 데이터 중 분석할 데이터는 '관측시간'과 '조위(cm)'이다. 하지만 리눅스의 스파이더에서는 한글 입력이 안되기 때문에 데이터를 처리하기에 앞서 각 열이름을 영어로 변환해줘야 한다. 따라서, 먼저 칼럼명(열이름)을 먼저 바꿔보도록 하겠다. 칼럼명 변경은 dataframe의 columns 또는 rename 속성을 활용한다.

t_data = pd.read_csv('./data_2023_DT_DT_78_202301_KR.txt', sep='\t', header=3, encoding='cp949')

pandas로 읽은 txt 조위 파일

 

1.1 columns ( DataFrame.columns = [ '헤더1', '헤더2', '헤더3' .... ] )

 columns 속성은 전체 컬럼명을 수정할 때 사용한다. 따라서 전체 컬럼명을 입력해야하며 dataframe.columns = ['열이름1', '열이름2', '열이름2'......]와 같이 입력하면 된다. 이 데이터는 총 15개의 칼럼으로 구성되어 있고, 이번 분석에서 활용할 데이터는 '관측시간'과 '조위(cm)'이므로 두 칼럼만 't_time', 'tide'으로 변경하고 나머진 a1, a2, a3 ~ 와 같이 임의의 이름으로 변경하도록 하겠다. 현재 읽어 놓은 dataframe은 t_data이므로 t_data.columns = ['t_time', 'tide', 'a1', 'a2', 'a3',....] 과 같이 입력하면 된다.

t_data.columns = ['t_time', 'tide', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10', 'a11', 'a12', 'a13']

columns 속성을 활용한 컬럼명(열이름) 수정
columns 속성을 활용한 컬럼명(열이름) 수정

1.2 rename ( DataFrame.rename(columns = {'before1' : 'after1', 'before2' : 'after2', ....} )

 rename은 특정 칼럼만 선택해서 칼럼명을 변경할 수 있다. dataframe.rename(columns={'기존칼럼명':'새칼럼명'}, inplace=True) 와 같이 입력하면 된다. inplace 옵션을 줘야 기존 dataframe이 수정되며, inplace옵션을 주지 않으려면, dataframe = dataframe.rename(columns={'기존칼럼명':'새칼럼명'}) 과 같이 새로 변수를 만들어야 한다. inplace옵션을 사용하는 것이 더 편하다. 따라서, t_data.rename(columns={'관측시간':'t_time', '조위(cm)':'tide'}) 와 같이 입력하면 된다.

 하지만 문제는 기존칼럼명이 한글이라 입력을 할 수 없다는 점이다. 이럴땐 기존칼럼명을 변수로 저장해서 활용하면 된다. 각 칼럼명을 저장할 임시 변수 aaa를 생성한다. 

aaa = t_data.columns
t_data.rename(columns={aaa[0]:'t_time', aaa[1]:'tide'},inplace=True)

한글 칼럼명을 수정하기 위한 변수화
한글 칼럼명을 수정하기 위한 변수화

 그럼 위와 같이 aaa라는 변수안에 각 한글칼럼명이 저장된다. 입력은 할 수 없지만 활용은 가능하다. '관측시간' 대신에 aaa[0], '조위(cm)' 대신에 aaa[1]을 입력하면 된다. 따라서 코드는 아래와 같으며, 정상적으로 칼럼명이 변경된 것을 확인할 수 있다.

rename을 활용한 칼럼명(열이름) 수정
rename을 활용한 칼럼명(열이름) 수정

 

 이제 시간정보는 t_data.t_time에, 조위정보는 t_data.tide에 저장하였다. 변수명이 길어지니, 시간정보는 t_time, 조위정보는 tide로 변수화하도록 하겠다. 또한 조위값이 아직 판다스의 시리즈형태로 저장되어 있는데, 연산 및 가공이 용이하도록 numpy열 및 숫자열로 변환한다. numpy.array('데이터', astype(float)) 과 같이 변환하면 되지만 가끔 아래와 같이 에러가 발생하는 경우가 있다. 바로 데이터 내의 오류값 또는 빈값 때문이다. 이 데이터에는 결측값이 하이픈 '-'으로 입력되어 있어 숫자로 변환할 때 에러가 발생하였다.

 

2. numpy를 활용한 문자열의 숫자변환

 t_data의 t_time과 tide를 개별 변수로 추출하면 (t_time = t_data.t_time; tide=t_data.tide), 아래와 같이 시리즈 형태의 데이터로 되어 있으며 아직은 문자열로 구성되어 있다. 따라서 조위데이터의 가공, 분석을 위해서는 숫자열로 변환해야 한다. 문자열 데이터를 숫자로 바꿀때는 보통 int(정수)나 float(실수)를 사용하지만 리스트형태의 배열은 int나 float로 변환할 수 없다. 숫자행렬의 분석, 연산 등이 용이한 패키지가 numpy인데 numpy를 활용하여 숫자열로 변환한다.

데이터프레임에서 추출한 시리즈 형태의 데이터
데이터프레임에서 추출한 시리즈 형태의 데이터
시리즈 형태는 int나 float로 숫자변환 불가

2.1 numpy.array (np.array(변수).astype(float))

 numpy의 array를 활용하여 숫자변환이 가능하다. 아래와 같이 문자열로 구성된 임의의 숫자 a 를 숫자열 b로 변경해보겠다. 먼저 numpy를 np로 불러온다. b=np.array(a).astype(float) 와 같이 입력하면 숫자열로 바뀐 b를 확인할 수 있다.

numpay.array를 활용한 문자열의 숫자변환numpay.array를 활용한 문자열의 숫자변환
numpay.array를 활용한 문자열의 숫자변환

 같은 방식으로 tide를 숫자열로 변환하면 된다. 그럼 상단에서 언급했던 에러가 발생한다. 조위 값에 결측값이 문자열인 '-' 하이픈으로 입력되어 있고, 이 문자가 숫자로 변환되지 않기 때문이다. 이렇게 문자형태의 결측값이 있을때 쉽게 해결할 수 있는 함수가 판다스의 to_numeric 이다.

문자열 데이터의 결측값으로 인한 숫자변환 에러
문자열 데이터의 결측값으로 인한 숫자변환 에러

 

2.2 결측값 숫자변환(nan처리) : pd.to_numeric(데이터, error='옵션')

 이러한 경우에 사용하는 것이 판다스의 to_numeric 함수이다. pd.to_numeric(칼럼, error='coerce')과 같이 사용한다. errors 옵션은 ignore, coerce, raise 세가지가 있는데 ignore은 해당 결측값을 변경하지 않고 원본 그대로 반환하고, coerce는 NaN값으로 반환하며, raise는 코드를 중단한다. 따라서 결측값은 nan값 처리를 해야하니 coerce 옵션을 사용한다. 그런 다음 위에서 숫자열로 바꿨던 것처럼  numpy를 이용하여 숫자열로 바꾸면 아래 사진과 같이 결측값이 nan처리된 데이터를 확인할 수 있다.

t_data.tide = pd.to_numeric(t_data.tide,errors='coerce')
tide = np.array(t_data.tide).astype(float)
t_time = t_data.t_time

pandas의 to_numeric 을 활용한 문자열의 숫자 변환
pandas의 to_numeric 을 활용한 문자열의 숫자 변환

 

 다음에는 문자열로 되어있는 시간정보를 변환하는 datetime 함수를 알아보도록 하겠다.

반응형