값 수정하기

from pandas import *

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)

print(s)

# 값 수정
s.iloc[0] = 0
s.loc['구구콘'] = 0
s['하겐다즈'] = 0

print(s)

 

값 삭제하기

drop 메서드는 원본 데이터가 변경되는 것을 방지하기 때문에 시리즈 원본 데이터를 제거하지 않고, 새로운 시리즈 객체를 반환한다.

따라서 변수에 다시 바인딩해야 한다.

# 값 삭제
s = s.drop('메로나')
s = s.drop(['구구콘', '하겐다즈']) # 여러 개 삭제

print(s)

 

값 추가하기

loc[]나 concat() 방법을 가장 많이 사용한다.

# 값 추가
s['new1'] = 1
s.at["new2"] = 2
s.loc["new3"] = 3
s = concat([s, Series([4], index=["new4"])])

print(s)

iloc (정수 위치 기반 인덱싱)

정수 기반으로 데이터를 선택한다.

리스트처럼 0부터 시작하는 정수 인덱스를 사용한다.

슬라이싱(:)을 활용하여 여러 개의 값을 선택할 수 있다.

 

loc (라벨 기반 인덱싱)

인덱스(라벨) 값을 기준으로 데이터를 선택한다.

숫자가 아닌 문자열 등 사용자 지정 인덱스를 사용한다.

범위를 지정할 때 끝값까지 포함한다. (iloc와 차이점)

 

인덱싱(indexing)과 슬라이싱(slicing)의 차이

pandas.Series나 pandas.DataFrame에서 데이터를 선택하는 방법은 크게 두 가지가 있다.

  1. 인덱싱: 하나의 값 또는 여러 개의 개별 값을 선택
  2. 슬라이싱: 연속된 범위의 값을 선택
import pandas as pd

data = [100, 200, 300]
index = ["월", "화", "수"]
s = pd.Series(data, index)

print(s.iloc[0]) # 100
print(s.iloc[1]) # 200
print(s.iloc[2]) # 300
print(s.iloc[3]) # IndexError

print(s.iloc[-1]) # 300
print(s.iloc[-2]) # 200
print(s.iloc[-3]) # 200
print(s.iloc[-4]) # IndexError

print(s.loc["월"]) # 100
print(s.loc["화"]) # 200
print(s.loc["수"]) # 300

# 인덱싱 (개별 값)
print(s.iloc[[0, 2]]) # 월 100 수 300
print(s.loc[["월", "수"]]) # 월 100 수 300

# 슬라이싱 (범위)
print(s.iloc[0:2]) # 월 100 화 200
print(s.loc["월":"화"]) # 월 100 화 200

Series

pandas.Series는 1차원 배열 형태의 데이터 구조고, 인덱스(index)와 값(value)으로 구성된 자료형이다.

 

주요 특징

  • 인덱스와 값으로 구성된다. 기본적으로 0부터 시작하는 정수형 인덱스가 자동 할당되지만, 직접 지정할 수도 있다.
  • 동일한 데이터 타입을 가진다. NumPy 배열(numpy.ndarray)과 유사하지만, 인덱스를 활용할 수 있다.
  • 딕셔너리와 비슷한 구조이다. 키(key) = 인덱스, 값(value) = 데이터 라고 생각하면 이해하기 쉽다.

 

기본 시리즈 생성 방법

import pandas as pd

data = ['가', '나', '다', '라'] # type = list
s = pd.Series(data) # type = pandas.core.series.Series

print(s)

 

자동 생성되는 정수형 인덱스가 아닌 별도로 지정할 수 있다.

from pandas import Series

data = [100, 200, 300]
index = ["월", "화", "수"]
s = Series(data, index)

print(s)

 

인덱스를 별도의 변수명으로 지정해도 된다.

from pandas import Series

name = ["메로나", "누가바", "빠삐코"] # data = name
price = [500, 800, 200] # index = price
menu = Series(name, price)

print(menu)

브로드캐스트 (Broadcasting)

파이썬에서 브로드캐스트는 주로 NumPy 배열에서 사용되는 개념으로, 다양한 크기의 배열들 간에 연산을 가능하게 만든다.

크기가 다른 배열끼리 연산할 때, 작은 배열이 큰 배열의 크기게 맞게 자동으로 확장되어 연산이 이루어지도록 도와준다.

즉, 작은 배열이 큰 배열에 맞게 확장되거나 "브로드캐스트" 되어 연산을 수행한다.

 

기본 연산

import numpy as np

a = np.array([10, 20, 30])
b = np.array([1, 2, 3])
c = np.array([1, 2, 3, 4, 5]) # a와 c를 연산하면 ValueError가 발생

print(a + b) # [11 22 33]
print(a - b) # [9 18 27]
print(a * b) # [10 40 90]
print(a / b) # [10. 10. 10.]
print(a % b) # [0 0 0]
print(a + 5) # [15, 25, 35]
data1 = np.array([1, 2, 3]) # 1D 배열
data2 = np.array([
    [10, 20, 30],
    [40, 50, 60],
    [70, 80, 90]
]) # 2D 배열

print(data1[0]) # 1
print(data2[0]) # [10 20 30]

print(data2[0, 2]) # 30
print(data2[0][2]) # 30

print(data1[1] * 10) # 20
print(data2[1] * 10) # [400 500 600]

print(data1 + data2) # [[11 22 33] [41 52 63] [71 82 93]]

 

조건문

arr = np.array([10, 20, 30, 40, 50])
cond1 = arr > 10
cond2 = arr < 40

print(arr > 20) # [False False  True  True  True]

print(cond1) # [False  True  True  True  True]
print(cond2) # [ True  True  True False False]

print(arr[cond1 & cond2]) # [20 30]
print(arr[cond1 & cond2] / 10) # [2. 3.]

 

함수와 메서드

  • axis=0: 열 방향(세로) 계산
  • axis=1: 행 방향(가로) 계산
arr = np.array([10, 20, 30, 40, 50])

print("합계:", arr.sum())  # 150
print("최솟값:", arr.min())  # 10
print("최댓값:", arr.max())  # 50
print("평균:", arr.mean())  # 30.0
print("표준편차:", arr.std())  # 14.142135623730951
print("분산:", arr.var())  # 200.0
arr_2d = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])

print("전체 합계:", arr_2d.sum())  # 45

print("열 방향 합계:", arr_2d.sum(axis=0))  # [12 15 18]
print("행 방향 합계:", arr_2d.sum(axis=1))  # [ 6 15 24]

print("열 방향 최댓값:", arr_2d.max(axis=0))  # [7 8 9]
print("행 방향 최댓값:", arr_2d.max(axis=1))  # [3 6 9]​

NumPy

NumPy는 Numerical Python의 약자로, 수치 연산을 효율적으로 처리할 수 있는 파이썬의 핵심 라이브러리이다.

배열(Array), 행렬(Matrix), 고차원 배열 및 그에 대한 연산을 지원하고, 수학적·과학적 계산을 할 때 필수적으로 사용한다.

 

주요 특징

  • 고속 연산:  Numpy는 C로 구현되어 있어 파이썬의 기본 리스트보다 훨씬 빠르게 수치 연산을 수행할 수 있다.
  • 다차원 배열 지원: 파이썬의 기본 리스트는 1차원 배열만 지원하지만, Numpy는 다차원 배열을 지원해 다양한 차원의 데이터를 처리할 수 있다.
  • 백터화 연산: 반복문을 사용하지 않고, 배열에 대한 연산을 백터화하여 빠르게 처리한다.
  • 다양한 수학 함수: 수학 함수, 선형 대수 연산, 푸리에 변환 등 수치적 계산을 위한 함수들을 제공한다.

 

NumPy Install

pip install numpy

 

NumPy Import

from numpy import *
또는
import numpy as np

 

NumPy Type

List (리스트)

  • 리스트는 파이썬의 기본 자료형으로, 순서가 있는 집합이다.
  • 리스트는 여러 데이터를 순차적으로 저장하고, 다양한 타입의 요소를 포함한다.
  • 인덱싱, 슬라이싱 등을 통해 요소에 접근할 수 있다.
  • 리스트의 요소를 추가, 수정, 삭제할 수 있다.

 

numpy.ndarray (NumPy 배열)

  • 고정 크기 배열이고, 메모리 효율적이다.
  • 다차원 배열 객체로, 고속 연산이 가능하다.
  • 백터화 연산 덕분에 반복문 없이 배열에 대한 연산이 가능하다.
  • 동일한 타입의 데이터만 저장할 수 있다. 즉, 하나의 배열 안에는 모든 원소의 데이터 타입이 동일하다.
import numpy as np

data = [1, 2, 3, 4] # type = list
np_data = np.array(data) # type = numpy.ndarray

print(data) # [1, 2, 3, 4]
print(np_data) # [1 2 3 4]

 

import numpy as np

data = [1, 2, 3, 4]

list_arr = data * 10
np_arr = np.array(data) * 10

print(list_arr)
print(np_arr)

 

multi_arr = np.array([
    [1, 2, 3, 4],
    [10, 20, 30, 40],
    [100, 200, 300, 400]
])

# 행 > 열 순서로 접근
print(multi_arr[0]) # [1 2 3 4]
print(multi_arr[1][2]) # 30
print(multi_arr[1, 2]) # 30
print(multi_arr[:, 3]) # [4 40 400]

+ Recent posts