본문 바로가기

회사생활/Python

파이썬 데이터 핸들링 함수 | Python Data Handling Function



파이썬 데이터 핸들링 함수 | Python Data Handling Function



내가 가진 데이터를 원하는 형태로 자르고 붙이고 나누고 바꾸는데 도움이 되는 기본적인 데이터 핸들링 함수에 대하여 포스팅하려고 한다.


크게 변형하려는 데이터가 문자열(String) 형태인 경우와 데이터프레임(DataFrame) 형태인 경우로 나누어서 포스팅해보겠다.


앞으로도 또 자주 사용할만한 함수가 나오면 계속 추가할 계획이다.



-

(1) 문자열 처리

(2) 데이터프레임 처리

-



(1) 문자열 처리

1. 숫자 앞에 0으로 자리 수 채우기


숫자 1 앞에 0으로 채워 2자리수의 문자열 만들기

str(1).zfiil(2)

실행결과: '01'


2. 기호로 문자열 나누기 (Split)


기호 ~ 을 기준으로 문자열 나누기

import re

re.split('~', '2011.01.01~2011.12.31')

실행결과: ['2011.01.01', '2011.12.31']


3. 문자열의 특정 문자 대체하기 (Replace)


문자열에서 '. (온점)'을 '-(하이픈)'으로 바꾸기

'2011.01.01'.replace('.', '-')

실행결과: '2011-01-01'​



4. 문자형 날짜 날짜형으로 바꾸기


문자형이었던 '2011-01-01'을 날짜형 데이터로 변환하기

​import datetime

datetime.datetime.strptime('2011-01-01', '%Y-%m-%d').date()



5. 문자열 양끝 공백 제거하기


문자열 중간 공백은 그대로 두고 양 끝 공백들만 제거하기

'   2011-01-01 ~ 2011-12-31          '.strip()

실행결과: '2011-01-01 ~ 2011-12-31'


6. 날짜형 데이터 만들기


2011년 3월 1일이라는 날짜형 데이터 만들고 출력하기

from datetime import date

start_date = date(2011, 3, 1)



print(start_date)

실행결과: '2011-03-01'



7. 날짜형 데이터를 문자형 YYYYMMDD로 만들기


위에서 만든 날짜형 데이터인 start_date '2011-03-01'을 문자형 YYYYMMDD 20110301로 바꾸기

start_date.strftime("%Y%m%d")

실행결과: '20110301'


8. 날짜형을 위한 range 함수 정의하기 (end_date 포함)


range 함수는 날짜형에서는 적용이 안되기 때문에 날짜형에서 적용되는 daterange 함수 정의하기

from datetime import timedelta, date  # timedelta() 시간 차이를 계산하는 함수, date() 시간변수를 만드는 함수



def daterange(start_date, end_date):

    for n in range(int ((end_date - start_date).days)):

        yield start_date + timedelta(n)


-
-

(2) 데이터프레임 처리


1. 컬럼이름을 지정해서 데이터프레임 만들기 - 단, 컬럼 순서는 알파벳 순으로 자동 바뀜


year, week, start_date, end_date 컬럼을 가진 calendar 데이터 프레임 만들기 - [y], [w], [sd], [ed]에는 각 컬럼에 들어갈 값의 리스트가 필요함

calendar = pd.DataFrame({"year": [y], "week": [w], "start_date": [sd], "end_date": [ed]})



2. 특정 컬럼으로 데이터프레임 오름차순 정렬하기


year, week 순으로 calendar 오름차순 정렬하기

calendar = calendar.sort_values(by=["year", "week"], ascending=True)



3. 인덱스 리셋하기 - Join 등으로 섞여진 인덱스를 0부터 순차적으로 다시 세팅

calendar = calendar.reset_index(drop=True)



4. 행(Row) 수가 같은 두 데이터프레임 옆으로 붙이기 (cbind)


데이터프레임 df_a과 행 수가 같은 데이터프레임 df_b를 옆으로 붙이듯이 합쳐서 df_c로 만들기

df_c = pd.concat([df_a.reset_index(drop=True), df_b], axis=1)



5. Key를 기준으로 두 데이터프레임 Inner Join 하기


df_a에 'A' 컬럼과 df_b의 'B'컬럼을 기준으로 Inner Join해서 df_c로 만들기

df_c = df_a.set_index('A').join(df_b.set_index('B'), how='inner').reset_index()


6. 특정 컬럼별로 특정 컬럼 요약하기 (Group By)


df_a의 A와 B를 기준으로 Group By 해서 A, B별 C의 평균으로 이루어진 데이터프레임 df_b 만들기

df_b = df_a.groupby(['A', 'B'])['C'].mean()


7. 인덱스를 컬럼으로 추가하기


6번의 경우 A와 B가 인덱스 형태로 추가되기도 하는데 이 경우 인덱스를 컬럼으로 추가하는 함수를 사용하면 유용하다.

df_b의 인덱스를 컬럼으로 추가하여 df_c 만들기

df_c = df_b.reset_index()



8. 열(Column) 수가 같은 두 데이터프레임 밑으로 합치기 (rbind)


데이터프레임 df_a과 열 수가 같은 데이터프레임 df_b를 밑으로 붙이듯이 합쳐서 df_c로 만들기

import pandas as pd



df_c = df_a.append(pd.DataFrame(data = df_b), ignore_index=True)



9. 데이터프레임의 특정 컬럼 값 안의 괄호 및 괄호안 텍스트 지우기


df_a 안의 A 컬럼에 들어있는 값 중 괄호 ( )가 있는 경우 괄호와 그 안에 있는 텍스트 지우기

df_a['A'].str.replace(r"\(.*\)","")


10. Multiple LIKE SQL문 쿼리


news_list DB 테이블에서 title이라는 컬럼에 article_artist 리스트에 있는 것 여러 개를 like 하고 싶은 경우

cur.execute("SELECT count(*) as cnt_news FROM news_list WHERE title like %s;", ('%'+article_artist[i]+'%',))



11. 플랏에서 한글 깨짐 방지


윈도우에서는​

from matplotlib import font_manager, rc

font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()

rc('font', family=font_name)


맥에서는

rc('font', family='AppleGothic')



plt.rcParams['axes.unicode_minus'] = False



12. 데이터프레임에서 컬럼의 숫자 반올림


df_a의 모든 숫자들을 소수점 2자리까지 반올림하기

df_a.round(2)


df_a의 A컬럼은 소수점 1자리까지, C컬럼은 소수점 2자리까지 반올림하기

df_a.round({'A': 1, 'C': 2})

13. 데이터프레임에서 기준값만 두고 녹이기 (Melt)


​df_a의 'A' 컬럼을 기준으로 두고 'B', 'C'는 variable 컬럼에 구분자로 넣고 'B', 'C' 컬럼의 값은 value 컬럼에 값으로 넣어 df_b 만들기

import pandas as pd



df_b = pd.melt(df, id_vars=['A'], value_vars=['B', 'C'])



14. 데이터프레임에서 기준값을 두고 구준자를 컬럼으로 뿌리기 (Cast, Pivot)


df_b를 'A' 컬럼을 행 기준으로 두고 'variable'컬럼의 값들을 각각 열 기준 컬럼으로 만든 틀을 두고 그 안에 'value' 컬럼의 값을 채운 df_c 만들기

import pandas as pd



df_c = df_b.pivot(index='A', columns='variable', values='value')


[ 계속 추가 예정입니다. ]