[Python] Basic(기초문법) 재정리 - 최신ver(2)
Python의 클래스와 데이터 분석을 위한 Class, NumPy, Pandas 을 정리한다.
클래스(Class) 기본 구조 🔍
버전 별 나누기 연산 바뀐점 참고
-
파이썬 2에서는 나누기 연산을 위해
__div__메서드를 사용했지만, 파이썬 3부터는__truediv__를 사용!class MyNumber: def __init__(self, value): self.value = value # 파이썬 3에서의 나누기 연산자 메서드 def __truediv__(self, other): return self.value / other.value
클래스의 기본 구성 요소
-
생성자 (
__init__): 객체가 생성될 때 호출되는 메서드로, 초기화를 담당class Car: def __init__(self, color, speed=0): self.color = color # 인스턴스 변수 self.speed = speed -
인스턴스 변수: 각 객체마다 별도로 유지되는 변수로,
self를 통해 접근def upSpeed(self, value): self.speed += value
특수 메서드와 속성
-
__dict__: 객체의 속성 정보를 딕셔너리 형태로 반환car = Car('red') print(car.__dict__) # 출력: {'color': 'red', 'speed': 0} -
__str__: 객체를 문자열로 표현할 때 사용하는 메서드class Car: # ... def __str__(self): return f"Car(color={self.color}, speed={self.speed})" print(car) # 출력: Car(color=red, speed=0)
접근 제어
-
프라이빗 변수: 변수 이름 앞에
__를 붙여서 사용하며, 클래스 외부에서 접근할 수 없다.class BankAccount: def __init__(self, balance): self.__balance = balance # 프라이빗 변수 def deposit(self, amount): self.__balance += amount
상속과 super()
-
자식 클래스에서 부모 클래스의 생성자나 메서드를 호출할 때
super()를 사용 -
상속은 괄호안에 넣어서 적용
class Vehicle: def __init__(self, make, model): self.make = make self.model = model class Truck(Vehicle): def __init__(self, make, model, capacity): super().__init__(make, model) # 부모 클래스의 생성자 호출 self.capacity = capacity- 만약 자식 클래스에서 생성자를 정의하지 않으면 부모 클래스의 생성자가 자동으로 호출됩니다.
불변 객체와 문자열
-
파이썬에서 문자열은 불변 객체로써 생성된 후 값을 변경할 수 없다.
-
동일한 문자열 리터럴은 메모리 절약을 위해 같은 객체를 참조
a = "hello" b = "hello" print(a is b) # 출력: True
NumPy
ndarray: NumPy의 핵심 자료구조
-
ndarray는 N차원 배열 객체로, 동일한 타입의 요소로 구성 -
리스트와 유사하지만, 더 빠르고 메모리를 효율적으로 사용하며, 벡터화 연산을 지원
import numpy as np arr = np.array([1, 2, 3])
ndarray의 주요 속성
-
shape: 배열의 차원 크기를 튜플로 반환 -
ndim: 배열의 차원 수를 반환 -
dtype: 배열 요소의 데이터 타입을 반환 -
itemsize: 배열 요소 하나의 바이트 크기를 반환 -
size: 배열 전체 요소의 개수를 반환arr = np.array([[1, 2], [3, 4]]) print(arr.shape) # 출력: (2, 2) print(arr.ndim) # 출력: 2 print(arr.dtype) # 출력: int64 (시스템에 따라 다를 수 있음) print(arr.itemsize) # 출력: 8 (시스템에 따라 다를 수 있음) print(arr.size) # 출력: 4
배열 생성
-
np.array(): 리스트나 튜플을 배열로 변환 -
np.arange(): 지정된 범위의 수열을 생성 -
np.linspace(): 시작과 끝을 지정하여 일정한 간격으로 수열을 생성 -
np.logspace(): 로그 스케일로 수열을 생성np.array([1, 2, 3]) # array([1, 2, 3]) np.arange(0, 3) # array([0, 1, 2]) np.linspace(0, 10, 5) # array([ 0. , 2.5, 5. , 7.5, 10. ]) np.logspace(0, 2, 5) # array([ 1. , 3.16227766, 10. , 31.6227766, 100. ])
배열 형태 변경
-
reshape(): 배열의 형태를 변경 -
flatten(): 다차원 배열을 1차원으로 평탄화arr = np.arange(10).reshape(2, 5) print(arr) # 출력: # [[0 1 2 3 4] # [5 6 7 8 9]] flat_arr = arr.flatten() print(flat_arr) # 출력: [0 1 2 3 4 5 6 7 8 9]
인덱싱과 슬라이싱
-
기본 인덱싱: 리스트와 유사하게 인덱스를 사용
-
슬라이싱:
[start:stop:step]형식으로 부분 배열을 가져옴 -
다차원 인덱싱: 쉼표를 사용하여 각 차원에 대한 인덱스를 지정
arr = np.arange(10).reshape(2, 5) # 요소 접근 print(arr[0, 2]) # 출력: 2 # 슬라이싱 print(arr[:, 1:3]) # 출력: # [[1 2] # [6 7]]
논리적 인덱싱
-
조건을 만족하는 요소를 선택할 수 있다.
ages = np.array([18, 25, 30, 21]) adults = ages[ages >= 20] print(adults) # 출력: [25 30 21]
Pandas
Pandas의 핵심 자료구조
-
Series: 1차원 배열로, 인덱스를 가짐import pandas as pd s = pd.Series([1, 2, 3], index=['a', 'b', 'c']) print(s) # 출력: # a 1 # b 2 # c 3 # dtype: int64 -
DataFrame: 2차원 데이터 구조로, 행과 열에 인덱스를 가짐data = { 'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35] } df = pd.DataFrame(data) print(df) # 출력: # name age # 0 Alice 25 # 1 Bob 30 # 2 Charlie 35
데이터 불러오기
-
CSV 파일 읽기
df = pd.read_csv('data.csv') -
인덱스 컬럼 지정하기
df = pd.read_csv('data.csv', index_col=0)
데이터 선택
-
열 선택
df['age'] # Series 반환 df[['name', 'age']] # DataFrame 반환 -
행 선택
df[0:2] # 슬라이싱으로 행 선택 df.head(2) # 위에서부터 2개 행 선택 -
loc와iloc-
loc: 라벨 기반 인덱싱df.loc[0, 'name'] # 첫 번째 행의 'name' 열 값 df.loc[:, 'age'] # 모든 행의 'age' 열 -
iloc: 정수 기반 인덱싱df.iloc[0, 1] # 첫 번째 행의 두 번째 열 값 df.iloc[:, 0] # 모든 행의 첫 번째 열
-
데이터 추가
-
열 추가
df['salary'] = [50000, 60000, 70000]
데이터 분석
-
기본 통계 정보
df.describe() # count, mean, std, min, max 등의 정보를 제공 -
표준편차 계산 시 유의사항
-
Pandas의
std()는 베셀 보정을 적용하여 자유도(n-1)를 사용합니다. -
NumPy의
np.std()는 기본적으로 n을 사용합니다.df['age'].std() # Pandas 표준편차 np.std(df['age']) # NumPy 표준편차
-
날짜 데이터 다루기
-
날짜 형식 변환
df['date'] = pd.to_datetime(df['date']) -
날짜 관련 정보 추출
df['year'] = df['date'].dt.year df['month'] = df['date'].dt.month df['day'] = df['date'].dt.day
데이터 그룹핑
-
groupby()grouped = df.groupby('month').mean() -
최대 또는 최소 값 찾기
max_value = grouped['sales'].max() max_month = grouped[grouped['sales'] == max_value]
데이터 필터링
-
조건을 사용한 필터링
high_salary = df[df['salary'] > 60000]
결손값 처리
-
결손값 확인
df.isna() # 결손값 여부를 True/False로 반환 df.isna().sum() # 결손값 개수 확인 -
결손값 제거
df.dropna(axis=0, how='any', inplace=True) # 결손값 포함된 행 제거 -
결손값 대체
df['salary'].fillna(df['salary'].mean(), inplace=True) # 평균값으로 대체- 파라미터 설명
-
axis: 축 지정 (0은 행,1은 열) -
how: 제거 조건 ('any'는 하나라도 결손값이면 제거,'all'은 모두 결손값일 때 제거) -
inplace: 원본 데이터프레임을 수정할지 여부
-
- 파라미터 설명
데이터 구조 변경
-
피벗 테이블
pivot_df = df.pivot(index='item', columns='type', values='price')-
index: 행 인덱스로 사용할 열 -
columns: 열 이름으로 사용할 열 -
values: 값으로 사용할 열
-
데이터 합치기
-
concat()combined_df = pd.concat([df1, df2], axis=0, join='outer')-
axis: 합칠 축 지정 (0은 행 방향,1은 열 방향) -
join: 조인 방식 ('outer','inner')
-
-
merge()merged_df = df1.merge(df2, how='inner', on='key')-
how: 조인 방식 ('inner','outer','left','right') -
on: 공통 열 이름
-
데이터 정렬
-
sort_values()df_sorted = df.sort_values(by='age', ascending=True) # 오름차순 정렬 df_sorted = df.sort_values(by='salary', ascending=False) # 내림차순 정렬
댓글남기기