판다스 하기 전에 선행 작업
가상환경생성
- conda create --name da python
- da라는 이름의 가상환경을 생성한다.
생성된 가상환경 조회
- conda info --envs
가상환경 활성화
- conda activate da
- da라는 가상환경을 활성화시킨다.
# lib 설치
- pip install pandas notebook matplotlib pymysql
가상환경 삭제
- conda remove --name da --all
판다스 (Pandas)
Pandas 개요
- 데이터 분석과 관련된 다양한 기능을 제공하는 파이썬 패키지
- 데이터 셋을 이용한 다양한 통계 처리 기능을 제공한다.
- 표 형태의 데이터를 다루는데 특화된 파이썬 모듈.
- 엑셀의 기능을 제공하는 파이썬 모듈이라고 생각하면 이해가 쉽다.
- 표 형태의 데이터를 다루기 위한 시리즈(Series) 와 데이터프레임(DataFrame) 클래스 제공
- Series : 1차원 자료구조를 표현
- DataFrame : 2차원 행렬구조의 표(table)를 표현
- 설치
- pip install pandas
- conda instll pandas
Series
Series 개요
- 1차원 자료구조
- DataFrame(표)의 한 행(row) 이나 한 열(column) 을 표현한다.
- 각 원소는 index와 index 이름을 가지며 그것들을 이용해 사용할 수 있다.
- 벡터화 연산(element-wise 연산)을 지원
- Series 객체에 연산을 하면 각각의 Series 원소들에 연산이 된다.
- Series를 구성하는 원소들을 다루는 다양한 메소드 제공
Series생성
- 구문
- Series(1차원 배열형태 자료구조)배열형태(array-like) 자료구조
- 리스트
- 튜플
- 넘파이 배열(ndarray)
- Series(1차원 배열형태 자료구조)배열형태(array-like) 자료구조
# pandas 모듈을 import -> 관례적으로 alias(별칭)을 pd
import pandas as pd
# Series 생성
s1 = pd.Series([1, 2, 3, 4, 5, 6, 7], dtype="int8")
print(type(s1))
print(s1)
Series에도 index가 있다.
index(순번)
- 자동으로 배정되는 순번.
- 리스트나 튜플의 index와 동일하다.
- 0 부터 1씩 증가하는 양수 index와 -1 부터 1씩 감소하는 음수 index 두가지가 붙는다. 양수 index는 앞에서 부터, 음수 index는 뒤에서 부터 붙는다.
index name(index이름)
- 명시적으로 각 index에 지정하는 이름
- 딕셔너리의 key의 역할을 한다.
- Series의 index name은 중복될 수 있다.
- 생략하면 양수 index가 index name이 된다.
s2 = pd.Series([10, 20, 30, 40], index=["A", "가", "A", "나"])
s2
# index name 조회
print(s1.index)
print(s2.index)
Indexing : 한개의 원소를 식별할 때 사용한다.
index 순번으로 조회
- Series[순번]
- Series.iloc[순번]
index 이름으로 조회
- Series[index 이름]
- Series.loc[index 이름]
- index 이름이 문자열이면 문자열(" ") 로, 정수이면 정수로 호출
- index의 이름이 파이썬 식별자 규칙에 맞을 경우 . 표기법 사용 할 수 있다..
Series[index]는 기본적으로 Index명으로 조회한다.
- index 이름과 index의 타입이 다르면 알아서 처리해준다.
- index 이름의 type이 int일 때 index(순번)으로 조회하고 싶은 경우 (index이름과 index 의 타입이 int로 같은 경우를 말한다.)
iloc indexer를 사용
Series객체.iloc[순번]
팬시(fancy) 인덱싱 -Series[index리스트]
- 한번에 여러개의 원소를 조회할 때 그 index들을 list로 묶어서 전달한다.
ex) series[[1,2,3]]
s1 = pd.Series([10, 20, 30, 40, 50, 60])
# indexer
s1
s1[0] #index 이름
# s1[-1] #음수 index 조회
# index name: int , index : int => 둘의 타입이 동일 ==> 구분안됨.
# => s1[-1]=> index name에서 찾는다.
s1.iloc[-1]
index 이름에 문자열
s2 = pd.Series([50, 70, 80, 50, 100], index=['국어', '영어', '수학', '과학', '미술 점수'])
s2
s2 조회(iloc, loc)
# index로 조회 -> iloc indexer
s2.iloc[0], s2.iloc[-2]
# index 이름 - loc indexer
s2.loc['국어'], s2.loc['수학']
fancy indexing
# 여러개 원소를 조회
## 조회하려는 index(index name)을 리스트로 묶어서 index에 전달. -> fancy indexing
s1[[1, 4, 5]]
s2.iloc[[0, 1, 2]]
s2.loc[['수학', '국어', '영어', '수학']]
Slicing : 범위로 원소들을 조회할 때 사용한다.
- Series[start index : stop index : step]
- Slicing의 결과는 원본의 참조(View)를 반환
Slicing은 shallow copy를 한다. 그래서 slicing한 결과를 원소를 변경하면 slicing 했던 원본도 같이 바뀐다.
원본은 변경되지 않게 하려면 slicing결과.copy() 를 이용해 deep copy를 해야 한다.
shallow copy와 deep copy
deep copy(깊은 복사)
- 원본과 동일한 값을 가진 새로운 객체를 만들어 반환한다. 그래서 복사본의 값을 변경해도 원본이 변경되지 않는다.
- 파이썬 리스트는 slicing시 deep copy를 한다.
shallow copy(얕은 복사)
- 원본을 반환하여 값 변경시 원본에 영향을 준다.
- Series, DataFrame, 넘파이 배열(ndarray)은 slicing 조회 시 shallow copy한다.
copy() 메소드
- Series, DataFrame, ndarray를 deep copy 한다.
s3 = pd.Series(range(100)) # 0 ~ 99, 100개
print(s3.size)
s3
index 조회
s3[10:50:5] # index조회: 10 ~ 50-1, step: 5
index reverse 조회
s3[50:30:-3] # start > stop, step: 음수 -> reverse(역순 조회)
s3의 0~9번 인덱스의 값을 r에 저장
r = s3[:10]
r
값 변경
# index 0 의 값을 100으로 변경
r[0] = 100
r[7] = 700 # index 7 값 -> 700
s3 확인 (shallow copy)
s3[:10] # 원본도 같이 변경된다. (shallow copy)
list slicing -> deep copy, pandas slicing -> shallow copy
조회의 목적으로 성능을 따지자면 shallow copy가 유리하다.
(deep copy -> 새로운 생성으로 인한 메모리의 성능 감소 유발)
r2 = s3[:5].copy() # series.copy() : 복사한 series를 생성. (deep copy)
# slicing 한 결과를 변경할 때 원본은 변경이 안되도록 할 경우 copy()를 사용.
r2 값 확인
r2
r2 값 변경
r2[0] = 5000
r2[1] = 6000
원본 s3 값 확인 (deep copy)
s3[:5] # 원본은 변경하지 않는다. (deep copy)'Data_Analysis_Track_33 > Python' 카테고리의 다른 글
| Python_Pandas_01-3(결측치) (0) | 2023.09.12 |
|---|---|
| Python_Pandas_01-2(벡터화, Boolean 인덱싱, 주요 메소드, 정렬, (평균, 중앙값, 표준편차/분산, 최빈값, 분위수)) (0) | 2023.09.12 |
| Python_11-2(pymysql을 이용한 mysql 연동) (0) | 2023.09.11 |
| Python_11(pymysql을 이용한 mysql 연동) (0) | 2023.09.08 |
| Python_10-2(파이썬 정규 표현식) (0) | 2023.08.29 |