판다스 데이터프레임으로 빠르게 데이터 파악하기
판다스 데이터프레임은 파이썬에서 데이터를 다룰 때 가장 많이 사용하는 데이터 형태입니다. 2차원 배열 형태를 다루는 DataFrame은 엑셀을 실행시켰을 때 나오는 화면과 흡사한데요. 이번 포스팅에서는 데이터 파악할 때 사용할 수 있는 pandas 패키지의 함수를 알아보겠습니다.
글의 순서
파이썬 데이터 분석 : 판다스 데이터프레임 활용
판다스 데이터프레임으로 데이터 파악하기
함수, 메쏘드, 어트리뷰트 구분
파이썬 데이터 분석 : 판다스 데이터프레임 활용
실습코드01에 지난 포스팅에서 만들었던 데이터분석을 위한 가장 간단한 예제를 나타내었습니다. 참고로 예제 데이터는 아이폰 프로세서의 성능변화를 가늠할 수 있도록 지난 5년간의 데이터를 요약한 것인데, 모두 문자열로 구성되어 있습니다. 문자열인지 파악하고, 데이터 타입을 실수형으로 바꾼 후 연산까지 해보겠습니다.
(1) 데이터프레임의 데이터 속성 확인, 변경
데이터 속성을 확인하기 위해서 df.dtypes 또는 df.info()를 활용할 수 있습니다. 결과를 보시면, 모든 열의 데이터 타입은 ‘object’입니다. date는 날짜 type으로, 나머지 CPU_clock(GHz), process(nm), transistors(billion) 열은 실수 type으로 바꿔주었습니다. 여기서, 날짜의 경우, 데이터프레임 변수가 가지고 있는 함수인 astype()을 이용하였습니다. 날짜 type 변환 방법은 이 밖에도 2가지가 더 있는데, 맨 아래 절에서 다시 살펴보겠습니다.
(2) 특정 column 값 추출
데이터프레임에서 특정 열(column)의 값을 추출하려면, 데이터프레임 이름 뒤에 [ ]를 써준다음, [ ] 안에 column 이름을 문자 형태로 써주면 됩니다. 실습코드01에서 트랜지스터 개수를 따로 추출하기 위해 df[‘transtors(billion)’] 이라고 쓴 부분입니다.
(3) 파이썬 내장함수를 이용한 연산
데이터프레임 특정 column의 값을 추출한 후, 합계를 구하고 평균을 구하는 등 파이썬 내장함수인 sum(), max(), min()으로 간단한 연산을 할 수 있습니다. 참고로, 파이썬에 기본적으로 내장되어 있는 함수는 따로 패키지를 설치하고, import문을 써서 가져오지 않아도 사용할 수 있습니다.
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 32 33 34 35 36 37 38 |
import pandas as pd data= { "model" : [ 'A17 Pro','A16 Bionic','A15 Bionic','A14 Bionic','A13 Bionic'], "date":['2023-09-12', '2022-09-07','2021-09-14','2020-09-15','2019-09-10'], "CPU_clock(GHz)":['3.78','3.46','3.23','3.1','2.65'], "process(nm)":['3','5','5','5','7'], "transistors(billion)":['19','16','15','11.8','8.5'] } # 01) 데이터프레임 생성 df = pd.DataFrame(data) print('#01 데이터프레임 df 생성') print(df) # 02) df의 데이터 타입 확인 print('\n','#02 df의 데이터 타입 확인') print('\n','#02-1 df.dtypes') print(df.dtypes) print('\n','#02-2 df.info()') print(df.info()) # 03) df의 데이터 타입 변경 df['date']=df['date'].astype('datetime64[ns]') df = df.astype({'CPU_clock(GHz)' : 'float', 'process(nm)' : 'float', 'transistors(billion)' : 'float'}) print('\n','#03 df의 데이터 타입 변경') print(df.dtypes) # 04) 특정 열(column) 값 출력 df_transistor = df['transistors(billion)'] print('\n', '#04 특정 열 값 출력') print(df_transistor) # 05) 파이썬 함수를 이용한 연산 print('\n', '#05 sum, max, min of transistor') print('sum : ',sum(df_transistor)) print('max : ',max(df_transistor)) print('min : ', min(df_transistor)) |
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#01 데이터프레임 df 생성 model date CPU_clock(GHz) process(nm) transistors(billion) 0 A17 Pro 2023-09-12 3.78 3 19 1 A16 Bionic 2022-09-07 3.46 5 16 2 A15 Bionic 2021-09-14 3.23 5 15 3 A14 Bionic 2020-09-15 3.1 5 11.8 4 A13 Bionic 2019-09-10 2.65 7 8.5 #02 df의 데이터 타입 확인 #02-1 df.dtypes model object date object CPU_clock(GHz) object process(nm) object transistors(billion) object dtype: object #02-2 df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 model 5 non-null object 1 date 5 non-null object 2 CPU_clock(GHz) 5 non-null object 3 process(nm) 5 non-null object 4 transistors(billion) 5 non-null object dtypes: object(5) memory usage: 328.0+ bytes None #03 df의 데이터 타입 변경 model object date datetime64[ns] CPU_clock(GHz) float64 process(nm) float64 transistors(billion) float64 dtype: object #04 특정 열 값 출력 0 19.0 1 16.0 2 15.0 3 11.8 4 8.5 Name: transistors(billion), dtype: float64 #05 sum, max, min of transistor sum : 70.3 max : 19.0 min : 8.5 |
판다스 데이터프레임 함수로 데이터 파악하기
분석해야 할 데이터를 만났을 때, 일반적으로 행과 열의 개수를 파악하고, 어떤 종류의 데이터인지 파악하는데요. 데이터를 파악할 때 빈번하게 사용하는 판다스의 명령어들을 정리하면 다음과 같습니다.
▶head() : 데이터의 앞부분 출력. 행의 개수를 괄호 안에 추가해서 그 만큼만 출력할 수도 있습니다.
▶tail() : 데이터의 뒷부분 출력. 행의 개수를 괄호 안에 추가해서 그 만큼만 출력할 수도 있습니다.
▶info() : 열의 속성 출력
▶describe() : 통계량 출력
▶index : 인덱스 레이블 출력
▶columns : 열 레이블 출력
▶dtypes : 데이터 타입 출력
▶values : 데이터프레임을 넘파이(numpy) 형식으로 출력
▶ndim : 데이터 차원 출력
▶size : 행(row)과 열(column) 개수를 정수형으로 출력
▶shape : 행(row)과 열(column) 개수를 튜플로 출력
▶empty : 데이터프레임이 비어있으면 True. 만약 빈 데이터프레임을 pd.DataFrame()으로 만들고 난 직후에 empty로 확인하면 False를 출력합니다.
▶memory_usage() : 각 열의 메모리 사용량을 byte 단위로 출력
여기서 head()처럼 ()가 있는 것과, shape처럼 괄호가 없는 것은 어떻게 다를까요? shape처럼 괄호 없이 사용하는 것을 어트리뷰트(atribute)라고 부르는데, 판다스 데이터프레임에서 shape이라는 변수가 가지고 있는 값을 의미합니다. 사용법은 df.shape처럼 함수와 동일합니다.각 함수의 사용법을 실습코드02에 나타내었습니다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import pandas as pd data= { "model" : [ 'A17 Pro','A16 Bionic','A15 Bionic','A14 Bionic','A13 Bionic'], "date":['2023-09-12', '2022-09-07','2021-09-14','2020-09-15','2019-09-10'], "CPU_clock(GHz)":['3.78','3.46','3.23','3.1','2.65'], "process(nm)":['3','5','5','5','7'], "transistors(billion)":['19','16','15','11.8','8.5'] } # 01) 데이터프레임 생성 df = pd.DataFrame(data) print('-- #01 데이터프레임 df 생성') print(df) # 02) df의 데이터 타입 변경 df['date']=df['date'].astype('datetime64[ns]') df = df.astype({'CPU_clock(GHz)' : 'float', 'process(nm)' : 'float', 'transistors(billion)' : 'float'}) print('\n','-- #02 df의 데이터 타입 변경') print(df.dtypes) # 03) 데이터 파악 print('\n', '-- #03 데이터 파악') print('\n', '--- #03-1 df.head()') print(df.head()) print('\n', '--- #03-2 df.tail(2)') print(df.tail(2)) print('\n', '--- #03-3 각 열의 속성') print(df.info()) print('\n', '--- #03-4 인덱스 레이블') print(df.index) print('\n', '--- #03-5 열 레이블') print(df.columns) print('\n', '--- #03-6 값. numpy 형식') print(df.values) print('\n', '--- #03-7 데이터 차원') print(df.ndim) print('\n', '--- #03-8 행*열 개수 (정수형)') print(df.size) print('\n', '--- #03-9 행, 열 개수 (튜플)') print(df.shape) print('\n', '--- #03-10 데이터가 비어있나?') print(df.empty) print('\n', '--- #03-11 각 열의 메모리 사용량(byte)') print(df.memory_usage()) |
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
-- #01 데이터프레임 df 생성 model date CPU_clock(GHz) process(nm) transistors(billion) 0 A17 Pro 2023-09-12 3.78 3 19 1 A16 Bionic 2022-09-07 3.46 5 16 2 A15 Bionic 2021-09-14 3.23 5 15 3 A14 Bionic 2020-09-15 3.1 5 11.8 4 A13 Bionic 2019-09-10 2.65 7 8.5 -- #02 df의 데이터 타입 변경 model object date datetime64[ns] CPU_clock(GHz) float64 process(nm) float64 transistors(billion) float64 dtype: object -- #03 데이터 파악 --- #03-1 df.head() model date CPU_clock(GHz) process(nm) transistors(billion) 0 A17 Pro 2023-09-12 3.78 3.0 19.0 1 A16 Bionic 2022-09-07 3.46 5.0 16.0 2 A15 Bionic 2021-09-14 3.23 5.0 15.0 3 A14 Bionic 2020-09-15 3.10 5.0 11.8 4 A13 Bionic 2019-09-10 2.65 7.0 8.5 --- #03-2 df.tail(2) model date CPU_clock(GHz) process(nm) transistors(billion) 3 A14 Bionic 2020-09-15 3.10 5.0 11.8 4 A13 Bionic 2019-09-10 2.65 7.0 8.5 --- #03-3 각 열의 속성 <class 'pandas.core.frame.DataFrame'> Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 model 5 non-null object 1 date 5 non-null datetime64[ns] 2 CPU_clock(GHz) 5 non-null float64 3 process(nm) 5 non-null float64 4 transistors(billion) 5 non-null float64 dtypes: datetime64[ns](1), float64(3), object(1) memory usage: 328.0+ bytes None --- #03-4 인덱스 레이블 RangeIndex(start=0, stop=5, step=1) PS C:\Users\bipoo> & "C:/Program Files/Python39/python.exe" c:/_python/pandas/basic/04_data_recognition+분석.py -- #01 데이터프레임 df 생성 model date CPU_clock(GHz) process(nm) transistors(billion) 0 A17 Pro 2023-09-12 3.78 3 19 1 A16 Bionic 2022-09-07 3.46 5 16 2 A15 Bionic 2021-09-14 3.23 5 15 3 A14 Bionic 2020-09-15 3.1 5 11.8 4 A13 Bionic 2019-09-10 2.65 7 8.5 -- #02 df의 데이터 타입 변경 model object date datetime64[ns] CPU_clock(GHz) float64 process(nm) float64 transistors(billion) float64 dtype: object -- #03 데이터 파악 --- #03-1 df.head() model date CPU_clock(GHz) process(nm) transistors(billion) 0 A17 Pro 2023-09-12 3.78 3.0 19.0 1 A16 Bionic 2022-09-07 3.46 5.0 16.0 2 A15 Bionic 2021-09-14 3.23 5.0 15.0 3 A14 Bionic 2020-09-15 3.10 5.0 11.8 4 A13 Bionic 2019-09-10 2.65 7.0 8.5 --- #03-2 df.tail(2) model date CPU_clock(GHz) process(nm) transistors(billion) 3 A14 Bionic 2020-09-15 3.10 5.0 11.8 4 A13 Bionic 2019-09-10 2.65 7.0 8.5 --- #03-3 각 열의 속성 <class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 model 5 non-null object 1 date 5 non-null datetime64[ns] 2 CPU_clock(GHz) 5 non-null float64 3 process(nm) 5 non-null float64 4 transistors(billion) 5 non-null float64 dtypes: datetime64[ns](1), float64(3), object(1) memory usage: 328.0+ bytes None --- #03-4 인덱스 레이블 RangeIndex(start=0, stop=5, step=1) --- #03-5 열 레이블 Index(['model', 'date', 'CPU_clock(GHz)', 'process(nm)', 'transistors(billion)'], dtype='object') --- #03-6 값. numpy 형식 [['A17 Pro' Timestamp('2023-09-12 00:00:00') 3.78 3.0 19.0] ['A16 Bionic' Timestamp('2022-09-07 00:00:00') 3.46 5.0 16.0] ['A15 Bionic' Timestamp('2021-09-14 00:00:00') 3.23 5.0 15.0] ['A14 Bionic' Timestamp('2020-09-15 00:00:00') 3.1 5.0 11.8] ['A13 Bionic' Timestamp('2019-09-10 00:00:00') 2.65 7.0 8.5]] --- #03-7 데이터 차원 2 --- #03-8 행*열 개수 (정수형) 25 --- #03-9 행, 열 개수 (튜플) (5, 5) --- #03-10 데이터가 비어있나? False --- #03-11 각 열의 메모리 사용량(byte) Index 128 model 40 date 40 CPU_clock(GHz) 40 process(nm) 40 transistors(billion) 40 dtype: int64 |
함수, 메쏘드, 어트리뷰트 구분
파이썬에서 함수는 종류에 따라 명령어를 입력하는 방법이 조금씩 다릅니다. 공통점은 모두 함수라는 것입니다. 여기에 추가로 메쏘드(method)와 대응시킬 수 있는 어트리뷰트(attribute)도 확인해 보시기 바랍니다.
▶함수 : 파이썬 내장함수는 sum()처럼 함수이름과 괄호()를 입력합니다.
▶패키지 함수 : 파이썬 패키지 안에 들어 있는 함수를 의미합니다. 패키지 이름을 쓰고 점을 찍은 후 함수이름과 괄호를 입력합니다. pd.DataFrame()처럼 말입니다.
▶메쏘드 : 변수가 가지고 있는 함수를 의미합니다. df.head(), df.describe()처럼 df라는 데이터프레임 변수 다음에 점을 찍고 함수명과 괄호를 입력합니다.
▶어트리뷰트 : 변수가 가지고 있는 값을 의미합니다. df.shape에서처럼 괄호를 따로 쓰지 않습니다.
판다스 데이터프레임의 열 데이터를 날짜 type으로 변경하는 방법
판다스 데이터프레임에서 날짜 type으로 바꿔주는 데는 아래처럼 3가지 옵션이 있습니다.
▶pd.to_datetime() : pandas 패키지 함수 이용
▶dt.datetime.strptime() : datetime 패키지 함수 이용
▶astype : 데이터프레임 변수가 가지고 있는 함수 이용
두 번째 dt.datetime.strptime()의 경우 datetime이라는 패키지가 필요하므로, 파일 맨 위에 아래의 명령어를 써 놔야 합니다.
import datetime as dt
마치며 …
판다스 패키지는 엑셀파일에서 볼 수 있는 표 형태의 데이터입니다. 판다스는 행과 열이 많은 큰 데이터를 명령어 몇 줄로 파악할 수 있습니다. 이번 포스팅에서는 딕셔너리 형태의 작은 데이터를 만든 후 데이터를 파악하기 위한 판다스 명령어들을 활용해 보았습니다. 함수, 메쏘드, 어트리뷰트도 구분하실 수 있다면, 이 포스팅의 목적 달성입니다.
함께 참고하면 좋은 글 :
▶ 파이썬 데이터 분석 : 판다스 인덱스
▶ 파이썬 판다스로 엑셀 파일의 원하는 부분 골라 읽기
▶ 파이썬 판다스로 텍스트 파일 읽기 : read_table()
▶ 파이썬 판다스 데이터 분석 : pivot, 엑셀 입력, 출력
▶ 파이썬 바이낸스 API로 비트코인 투자 백테스팅 : 일중 강도(II) 매매 전략
▶ 파이썬 데이터 분석 : 판다스 데이터프레임 통계량, 그래프
참고자료
pandas, pandas.DataFrame