Data_Analysis_Track_33/Python

Python_Pandas_01(Pandas, Series, Index, Slicing)

lsc99 2023. 9. 12. 20:54

판다스 하기 전에 선행 작업

가상환경생성
- 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)
# 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)