AI study - NumPy, Pandas, Series

안준영·2023년 9월 25일
0
post-thumbnail

1. NumPy

1-1 NumPy란?

NumPy란 파이썬에서 가장 기본적인 과학적 계산을 위한 패키지로 행렬 처리 및 계산에 용이하다.

1-2 NumPy 임포트

import numpy as np

보통 NumPy 라이브러리를 사용할 때는 이 문법을 사용한다.

1-3 NumPy의 용도

NumPy의 용도를 말하기 전에, 우선 일반적인 파이썬의 List와 튜플의 타입 속성에 대해 알 필요가 있다. 일반적인 list는 가로, 즉 행 단위로 접근 가능하지만, 열 단위로는 접근이 불가능하다. 그리고 튜플은 애초에 수정이 불가능하다. 하지만, type을 NumPyarray로 바꿔주면 열 간의 계산도 가능하게 된다.

price = [
[100, 80, 70,90],
[120, 110, 100, 110]
]

print(price[0])

이런 식으로 코딩하게 되면, 이는 리스트 타입이기 때문에 [100, 80, 70, 90]이 출력될 것이다. 그리고 price[0][0]을 출력하게 되면, 100이라는 값을 출력 받을 수 있게 되지만, 위에서 말한 것과 같이 여러개의 열 간의 계산을 하기 힘들어진다.

하지만 NumPy 슬라이싱을 통해 np.arr2[:, 0]을 출력하게 되면 행의 모든 것과 열은 0번째(첫번째)의 값을 출력 받을 수 있다.

1-4 ndarray란?

ndarray란 다차원 행렬구조를 말하는 것으로 두 가지 이상의 리스트 형식을 빌려 행렬 구조를 만들어 행렬 표나 벡터 계산을 편리하게 해주는 것이다. 이는 주로 np.array()를 통해 만들어진다.

2. Pandas와 Series

2-1 Pandas란?

Pandas란 NumPy와 같이 패기지이지만 NymPy는 보통 수치를 다루지만, Pandas는 주로 파이썬 데이터를 처리하고 분석하는 패키지이다. Pandas에는 Series와 다음 포스팅에서 다룰 데이터프레임(DataFrame), 그리고 패널 등의 데이터 구조를 가진다.

2-2 Series

from pandas import Series
	Series()
    
import pandas as pd
	pd.Series()

위 코드들은 모두 series를 임포트하기 위한 방식으로 Series는 보통 1차원 데이터를 위한 자료구조이다.

from pandas import Series
 	arr = [0, 1, 2, 3]
    s = Series(arr)
    print(s)

이는 arr이라는 리스트를 생성하고 Series()를 통해 Series 클래스로 만들었다.

2-3 Series의 내부구조

Series 클래스는 보통 행번호와 인덱스를 사용하여 데이터를 관리한다. 여기서 행번호는 수정 불가능하지만, 인덱스 값은 수정이 가능하기에 보통 날짜나 가격 등으로 표현이 가능하다.

from pandas import Series
	price = [1000, 2000, 3000]
    index = ["사탕", "초콜릿", "과자"]
    s = Series(price)
    print(s)

이 값을 출력하면

0	사탕	  1000
1	초콜릿	 2000
2	과자	 3000
dtype: int64

이 값으로 출력된다. 옆에 있는 값이 행번호이고, index라는 변수를 통해 인덱스를 사탕, 초콜릿, 과자로 만들었다.

2-4 Series 인덱싱

Series를 인덱싱(특정 데이터를 뽑는 것)할 수 있는 방법은 총 세가지이다. 첫 번째 방법은 iloc[]을 사용하는 것이다.

from pandas import Series
	price = [1000, 2000, 3000]
    index = ["사탕", "초콜릿", "과자"]
    s = Series(price)
    print(iloc[0])
    

이를 출력하면, 1000이라는 값이 나온다. 이는 행번호가 0인 값의 데이터(인덱스X)인 1000을 출력하는 것이다

두 번째 방법은 loc[]를 사용하는 것이다.

from pandas import Series
	price = [1000, 2000, 3000]
    index = ["사탕", "초콜릿", "과자"]
    s = Series(price)
    print(loc["사탕"])

이 또한 출력값은 1000이 나온다. 하지만 iloc과 loc의 차이점은 iloc은 []안에 행 번호를 사용하지만, loc[] 안에는 인덱스 값이 들어간다.

세 번째 방법은

from pandas import Series
	price = [1000, 2000, 3000]
    index = ["사탕", "초콜릿", "과자"]
    s = Series(price, idex)
    print(s["사탕"])

이 또한 출력값은 1000이다.

2-5 Series 슬라이싱

Series 슬라이싱(특정 구간의 데이터만 뽑아내는 것)을 하는 방법으론 두 가지가 있다.

from pandas import Series
	price = [1000, 2000, 3000]
    index = ["사탕", "초콜릿", "과자"]
    s = Series(price, idex)
    print(s.iloc[0:1])

위 코드의 출력값은

사탕		1000
초콜릿	   2000

이다. iloc[]안에는 슬라이싱 하고 싶은 곳의 처음과 마지막 행 번호를 쓰고 그 가운데에 :를 쓰면 된다.

두 번째 방법은 loc를 쓰는 방법이다. 인덱싱할 때와 같이 loc 안에는 슬라이싱하고 싶은 처음과 마지막 인덱스를 쓰고, 가운데에 :를 쓰면 된다.

그리고 변수를 하나 더 생성하여 특정 행번호가 적힌 리스트를 생성하면 굳이 연속되지 않아도 특정 데이터를 뽑아 쓸 수 있다.

2-6 Series 값 추가 및 삭제, 수정

from pandas import Series
	price = [1000, 2000, 3000]
    index = ["사탕", "초콜릿", "과자"]
    s = Series(price, idex)
    
    s.loc["젤리"] = 1500
    s1 = s.drop("과자")

이런 코드의 출력 값은 젤리와 1500의 인덱스가 추가되고, 과자와 인덱스 값 3000이 삭제가 된 채로 출력이 된다. 여기서 drop 함수를 쓸 때 주의해야 할 점은 전에 있던 리스트가 사라지지 않은 채로 남아있다는 것이다.

2-7 브로드케스팅과 사칙, 비교연산

from pandas import Series

s = Series([100, 200, 300])

print(s+10)

이 코드의 출력값은 100, 200, 300에 10씩 더해진 채로 나온다.

from pandas import Series

s = Series(data = [100, 200, 300])
cond = s >=200 
print(cond)

이 코드의 출력값은 200과 300은 True, 100에는 False인데, 이처럼 class가 series인 것에 비교연산을 통해 정할 수도 있고, 다른 리스트끼리 각 데이터가 수가 같은 때에는 +,-와 같은 사칙연산도 가능하다.

profile
함께하는 스터디

0개의 댓글