PANDAS
- 파이썬의 데이터 분석 라이브러리
- 데이터 테이블을 다루는 도구입니다.
- 표데이터를 분석하기 위한 도구들이 SQL 보다 더 많습니다.
▶ 기본적으로 넘파이를 사용합니다.
- 넘파이 : 파이썬에서 배열을 다루는 최적의 라이브러리
- 판다스는 넘파이를 효율적으로 사용하기 위해 인덱싱, 연산, 전처리 등 다양한 함수를 제공합니다.
Pandas의 개념
DataFrame : 데이터 테이블 전체 객체.
Series : 각 열 데이터를 다루는 객체. (하나의 Vector)
시리즈 객체
- Feature vector와 같은 개념입니다.
- 일반적으로 하나의 피쳐 데이터를 포함하는 형태입니다.
- 생성된 데이터 프레임 안에 포함될 수 있습니다.
- list, dict, ndarray 등 다양한 데이터 타입이 시리즈 객체 형태로 변환되기도 합니다.
▶ 시리즈 객체 생성시 세 가지 property(요소).
시리즈(Series) 객체는 넘파이 배열(ndarray)의 하위 클래스 입니다.
- data
- 기존 다른 객체처럼 값을 저장하는 요소.
- Index
- 항상 0부터 시작하고, 숫자로만 할당하는 값
- 시리즈 객체에서는 숫자, 문자열, 0 외의 값으로 시작하는 숫자, 순서가 일정하지 않은 숫자를 입력할 수 도 있습니다.
- 중복을 허용합니다.
- data type
- 넘파이의 데이터 타입과 일치합니다.
- 판다스는 넘파이의 wrapper library
- 넘파이의 모든 기능을 지원하고 데이터 타입도 그대로 적용합니다.
시리즈 객체 생성
데이터 프레임 객체를 먼저 생성하고 각 열에서 시리즈 객체를 뽑는 것이 일반적인 방법입니다.
판다스의 모든 값은 인덱스값을 기준으로 생성합니다.
▶ Pandas 모듈 호출
기존 아나콘다는 설치가 되어 있습니다.
import pandas as pd
▶ 리스트 → 시리즈
list_data = [1, 2, 3, 4, 5]
example_obj = pd.Series(list_data)
print(example_obj)
# 0 1
# 1 2
# 2 3
# 3 4
# 4 5
# dtype: int64
▶ 인덱스 별칭 지정
list_data = [1, 2, 3, 4, 5]
list_name = ["a", "b", "c", "d", "e"]
example_obj = pd.Series(data = list_data, index = list_name)
print(example_obj)
# a 1
# b 2
# c 3
# d 4
# e 5
# dtype: int64
▶ 사전 → 시리즈
기존 데이터에 더 많은 인덱스 값을 추가 하면 Nan값이 출력됩니다.
dict_data_1 = {"a" : 1, "b":2, "c":3, "d":4, "e":5}
indexex = ["a", "b", "c", "d", "e", "f", "g", "h"]
series_obj_1 = pd.Series(dict_data_1, index=indexex)
print(series_obj_1)
# a 1.0
# b 2.0
# c 3.0
# d 4.0
# e 5.0
# f NaN
# g NaN
# h NaN
# dtype: float64
▶ 데이터 타입 설정
다양한 시퀀스형 데이터 타입으로 저장이 가능합니다.
dict_data = {"a" : 1, "b":2, "c":3, "d":4, "e":5}
series_obj_1 = pd.Series(dict_data, dtype = np.float32)
print(series_obj_1)
# a 1.0
# b 2.0
# c 3.0
# d 4.0
# e 5.0
# dtype: float32
▶ 시리즈 이름 지정
* 거의 사용하지 않습니다
dict_data = {"a" : 1, "b":2, "c":3, "d":4, "e":5}
example_obj = pd.Series(dict_data, dtype = np.float32, name = "example_data")
print(example_obj)
# a 1.0
# b 2.0
# c 3.0
# d 4.0
# e 5.0
# Name: example_data, dtype: float32
▶ 데이터 정보 확인
print(example_obj.values)
# [1. 2. 3. 4. 5.]
print(example_obj.index)
# Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
print(example_obj.dtype)
# float32
print(type(example_obj.values))
# <class 'numpy.ndarray'>
▶ 시리즈 객체의 이름 변경
- 열의 이름을 지정해주는 방식입니다.
- 인덱스 이름도 추가로 지정이 가능합니다.
example_obj.name = "number"
example_obj.index.name = "id"
example_obj
# id
# a 1.0
# b 2.0
# c 3.0
# d 4.0
# e 5.0
# Name: number, dtype: float32
▶ 데이터 추출하기
# series_obj_1의 1번째 원소를 선택 합니다.
print(series_obj_1[1])
# 2.0
# b라벨을 가진 원소를 선택합니다.
print(series_obj_1["b"])
# 2.0
# c와 e원소를 선택합니다.
print(series_obj_1[["c", "e"]])
print(series_obj_1[[2, 4]])
# c 3.0
# e 5.0
# dtype: float32
# b에서 d까지의 원소를 선택합니다.
print(series_obj_1['b':'d']) # 별칭을 타겟으로 지정 할 경우 미만의 개념이 없습니다.
print(series_obj_1[1:4])
# b 2.0
# c 3.0
# d 4.0
# dtype: float32
데이터 프레임 객체
- 데이터 테이블 전체를 지정하는 객체
- 넘파이 배열의 특성을 그대로 가집니다.
* 인덱싱 : 열과 행 각각 사용하여 하나의 데이터로 접근합니다.
▶ 데이터프레임 생성
▷ 딕셔너리로 생성
딕셔너리 타입 데이터에서 Key는 colum, Value는 시퀀스형 데이터 타입을 입력하여 각 열의 데이터를 만듭니다.
table = {"나이" : [15, 17],
"성별" : ['남', "여"],
"학교" : ["덕영중", "수리중"]}
pd.DataFrame(table, index=["준서","예은"])
▷ 벡터로 생성
# 두개의 벡터로 생성
v1 = [15, '남', '덕영중']
v2 = [17, '여', '수리중']
pd.DataFrame([v1, v2], columns=["나이", "성별", "학교"], index=["준서", "예은"])
▶ index, column 추출
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)
print(df.index)
# RangeIndex(start=0, stop=5, step=1)
print(df.columns)
# Index(['first_name', 'last_name', 'age', 'city'], dtype='object')
print(df.columns[3])
# city
▷ 데이터 생성시, Column 이름을 한정하면 해당 Row만 추출합니다.
pd.DataFrame(raw_data, columns = ["age", "city"])
▷ 데이터가 존재하지 않는 Row를 추가하면 해당 Row에는 NaN값을 추가합니다.
pd.DataFrame(raw_data, columns = ["age", "city", "debt"])
▶ Column, row 이름 변경
df = pd.DataFrame(raw_data)
df.index = ["student1", "student2", "student3", "student4", "student5"]
df.columns = ['이름', "성", "나이", "지역"]
print(df)
# 이름 성 나이 지역
# student1 Jason Miller 42 San Francisco
# student2 Molly Jacobson 52 Baltimore
# student3 Tina Ali 36 Miami
# student4 Jake Milner 24 Douglas
# student5 Amy Cooze 73 Boston
▷ 각각의 column과 row를 타겟을 지정하여 변경합니다.
inplace의 값을 True로 입력해야 원본이 변경됩니다.
# 컬럼 이름중 '나이'를 '연령'으로 '지역'을 '도시'로 변경합니다.
df.rename(columns = {"나이" : "연령", "지역" : "도시"}, inplace = True)
# 행 인덱스 중에서 'student1'을 '학생1'로 변경합니다.
df.rename(index={'student1' : "학생1"}, inplace=True)
▷ # axis의 값이 기본 값이 0이기 때문에 'index=' 입력하지 않아도 index가 변경됩니다.
df.rename({'student2' : "학생2"})
데이터 로딩
▶ openpyxl 모듈 설치
!conda install --y openpyxl
▶ read_excel 함수로 엑셀 데이터 호출
pd.read_excel("파일 주소")
import pandas as pd # pandas 모듈 호출
import numpy as np # numpy 모듈 호출
df = pd.read_excel("/Users/werther/excel-comp-data.xlsx")
▶ 머리, 꼬리 호출
- head와 tail 함수 : 처음 n개 행이나 마지막 n개 행 호출
- 기본으로 5개가 출력됩니다.
df.head()
df.head(2)
df.tail()
df.tail(2)
▶ 열 이름을 사용한 데이터 추출
- Column 이름을 리스트 형태로 넣어 호출합니다.
- 가장 일반적인 호출 방법입니다.
- 문자형 Column 이름을 하나만 넣으면 값이 시리즈 객체로 반환됩니다.
- Column 이름을 여러개 넣으면 데이터 프레임 객체로 반환됩니다.
▷ 데이터 프레임으로 반환.
df[["account", "street", "state"]].head(3)
▷ 시리즈 객체로 반환
df["account"].head(3)
# 0 211829
# 1 320563
# 2 648336
# Name: account, dtype: int64
▷ 동일합니다.
df.account.head(3) # df['account'].head(3)
# 0 211829
# 1 320563
# 2 648336
# Name: account, dtype: int64
'Python' 카테고리의 다른 글
[Python] 데이터 확인 (0) | 2022.09.27 |
---|---|
[Python] Web scrapping (0) | 2022.09.27 |
[Python] 파일 저장 (0) | 2022.09.27 |
[Python] numpy 내적연산 (1) | 2022.09.24 |
[Python] numpy (0) | 2022.09.22 |