pandas는 파이썬계의 엑셀이라고 불리며, 주로 데이터 분석 시 활용되는 라이브러리 입니다.
또한, 엑셀의 스프레드시트의 구조와 같은 데이터를 처리할 때 가장 쉽게 사용할 수 있는 파이썬 라이브러리입니다.
그래서 데이터 테이블을 다루기 위한 도구로 가장 적합합니다.
pandas는 데이터를 다루기 위해 numpy(파이썬에서 배열을 다루는 최적의 라이브러리)를 기본적으로 사용하며, numpy를 효율적으로 사용하기 위해 인덱싱, 연산, 전처리 등 다양한 함수를 제공합니다.
데이터프레임
(DataFrame) : 데이터 테이블 전체 객체
시리즈 객체
(Series) : 각 열 데이터를 다루는 객체
용어가 생소하다보니 일반적인 DBMS 구조와 비교해서 이해하려고 노력해봤습니다.
데이터 프레임 - 테이블
시리즈 - 컬럼
feature vector와 같은 개념으로 일반적으로 하나의 피쳐 데이터를 포함하는 형태를 말합니다.
생성된 데이터프레임 안에 포함될 수 있으며 list, dict, ndarray 등 다양한 데이터 타입이 시리즈 객체 형태로 변환되기도 합니다.
위 그림과 같이 시리즈 객체를 생성하면 데이터(data)
, 인덱스(index)
, 데이터 타입(data type)
구조를 가집니다.
import pandas as pd # pandas 모듈 호출
import numpy as np # numpy 모듈 호출
# pandas.Series로 불러오는 대신 아래와 같이 불러오면 바로 Series, DataFrame을 호출할 수 있음.
from pandas import Series, DataFrame
list_data = [1,2,3,4,5]
list_name = ["a", "b", "c", "d", "e"]
example_obj = Series(data = list_data, index=list_name)
example_obj # 결과 : 아래 그림 참조
example_obj.index # Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
# 데이터 값을 보기 위해서는 values를 사용
example_obj.values # array([1, 2, 3, 4, 5])
# 실제 생성된 values는 numpy 배열 타입
type(example_obj.values) # numpy.ndarray
# dtype은 데이터의 타입을 나타냄
example_obj.dtype # dtype('int64')
시리즈 객체는 아래와 같이 객체의 이름을 변경할 수 있습니다. 위 예시코드에 이어서 작성해보겠습니다.
example_obj.name = "number"
example_obj.index.name = "id"
example_obj
이번에는 시리즈 객체를 생성하는 방법을 알아보겠습니다.
dict_data = {"a" : 1, "b" : 2, "c" : 3, "d" : 4, "e" : 5}
example_obj = Series(dict_data, dtype=np.float32, name="example_data")
example_obj
Pandas
의 모든 객체는 인덱스 값을 기준으로 생성됩니다.
NaN
이 출력됩니다. (매칭 되는 데이터가 없으므로)dict_data_1 = {"a" : 1, "b" : 2, "c" : 3, "d" : 4, "e" : 5}
indexes = ["a", "b", "c", "d", "e", "f", "g", "h"]
series_obj_1 = Series(dict_data_1, index=indexes)
series_obj_1
데이터 프레임
객체는 데이터 테이블 전체를 지칭하는 객체 입니다.
시리즈의 묶음이기 때문에 Numpy 배열의 특성을 그대로 가지며, 각각의 열 별로 데이터 타입이 다를 수 있습니다.
그리고 열과 행을 각각 사용해서 하나의 데이터에 접근하는 인덱싱도 가능합니다.
데이터 프레임은 read_확장자
함수로 데이터를 바로 로딩하여 생성할 수 있습니다.
# 데이터 URL을 변수 data_url에 할당
data_url = 'url'
# csv 데이터 로드
df_data = pd.read_csv(data_url, sep='\s+', header= None)
df = pd.DataFrame(df_data)
df
또는, 데이터 프레임을 직접 생성할 수도 있습니다.
from pandas import Series, DataFrame
raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
'age': [42, 52, 36, 24, 73],
'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city'])
df
데이터를 생성할 때, 열의 이름을 한정하면 해당 열만 추출 할 수 있습니다.
만약 데이터가 존재하지 않는 열을 추가한다면 해당 열에는 NaN 값들이 출력되게 됩니다.
DataFrame(raw_data, columns = ["age", "city"])
이번엔 .xlsx 형태 파일에서 데이터를 추출하는 몇가지 방법을 알아보겠습니다.
이에 앞서 openpyxl
모듈을 설치해야 합니다.
아래 코드는 주피터 노트북에서 패키지를 설치하는 코드입니다. (colab에서도 동작하는지는 모르겠습니다..)
# 콘솔 명령어는 앞에 ! 를 붙여 실행시켜야 합니다.
!conda install --y openpyxl
read_excel
함수로 엑셀 데이터 호출import pandas as pd
import numpy as np
# 로컬 PC에서 데이터 파일을 업로드 하는 방법
# goole.colab으로 부터 files 패키지를 import한다.
from google.colab import files
#파일 업로드 기능 실행
uploaded = files.upload()
df = pd.read_excel("excel-sample-data.xlsx")
head
와 tail
함수 : 처음 n개 행이나 마지막 n개 행 호출df.head(5)
df.head(3).T
“열 이름을 리스트 형태로 넣어 호출”
하는 방법입니다.
df[["account", "street", "state"]].head(3)
df[:3]
df[["name","street"]][:2]
인덱스 이름과 열 이름으로 데이터를 추출하는 함수 입니다.
일반적으로 인덱스의 초기값은 0이나 필요에 따라서는 인덱스의 값을 변경할 수 있습니다.
아래 코드는 기존 index를 지우고 account 값을 인덱스로 지정하는 코드입니다.
df.index = df["account"]
del df["account"]
df
그래서 인덱스 대신 특정 account 번호를 넣어서 loc 함수를 호출하고 원하는 데이터를 호출할 수 있습니다.
df.loc[[211829,320563],["name","street"]]
df.loc[205217:,["name","street"]]
이때, 인덱스 번호가 항상 정렬되어 있지 않아 처음 저장된 순서대로 출력됩니다.