[python] 판다스, 넘파이
Categories: python
📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]
넘파이
- 넘파이란 ?
- 넘파이(NumPy)는 파이썬에서 수치 데이터를 다루기 위한 핵심 라이브러리
- 넘파이는 대규모 다차원 배열과 행렬을 지원하며, 이들을 효율적으로 조작할 수 있는 다양한 수학 함수를 제공
- 편의성뿐만 아니라, 속도면에서도 순수 파이썬에 비해 압도적으로 빠르다는 장점이 있다.
- Numpy의 핵심이라고 불리는 다차원 행렬 자료구조인 ndarray를 통해 벡터 및 행렬을 사용하는 선형 대수 계산에서 주로 사용
- 주요 특징
- 빠른 연산 속도: 넘파이 배열은 파이썬의 기본 리스트보다 훨씬 빠른 연산 속도를 제공
- 다차원 배열: 넘파이는 다차원 배열 객체인
ndarray
를 제공합니다. - 벡터화 연산: 복잡한 수학 연산을 단순한 코드로 작성가능
- 다양한 함수 제공: 수학, 통계, 선형대수 등 다양한 수학 함수를 제공
-
넘파이 설치 및 시작하기
1 2 3 4 5
# 콘솔에서 설치 pip install numpy # import문 작성 import numpy as np
- 배열 생성
-
리스트를 사용하여 배열 생성
1 2 3 4 5 6 7 8
# 리스트를 사용하여 1차원 배열 생성 arr1 = np.array([1, 2, 3, 4, 5]) print(arr1) # 출력: [1 2 3 4 5] # 리스트를 사용하여 2차원 배열 생성 arr2 = np.array([[1, 2, 3], [4, 5, 6]]) print(arr2) # 출력: [[1 2 3] # [4 5 6]]
-
초기화된 배열 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# 모든 요소가 0인 배열 생성 zeros = np.zeros((3, 3)) print(zeros) # 출력: [[0. 0. 0.] # [0. 0. 0.] # [0. 0. 0.]] # 모든 요소가 1인 배열 생성 ones = np.ones((2, 4)) print(ones) # 출력: [[1. 1. 1. 1.] # [1. 1. 1. 1.]] # 특정 값으로 초기화된 배열 생성 full = np.full((3, 3), 7) print(full) # 출력: [[7 7 7] # [7 7 7] # [7 7 7]] # 단위 행렬 생성 identity = np.eye(4) print(identity) # 출력: [[1. 0. 0. 0.] # [0. 1. 0. 0.] # [0. 0. 1. 0.] # [0. 0. 0. 1.]]
-
연속된 값, 랜덤 값으로 배열 생성
1 2 3 4 5 6 7
# 연속된 값으로 배열 생성 sequence = np.arange(10) print(sequence) # 출력: [0 1 2 3 4 5 6 7 8 9] # 랜덤 값으로 배열 생성 random_arr = np.random.random((3, 3)) print(random_arr) # 출력: 3x3 크기의 랜덤 값 배열
random 패키지의 random 메서드 사용
자바의 랜덤 메서드처럼 0~ 1사이 숫자의 랜덤값을 생성한다
-
-
배열 속성
1 2 3 4 5 6 7 8
arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr.ndim) # 배열의 차원 수 출력: 2 print(arr.shape) # 배열의 형태 출력: (2, 3) print(arr.size) # 배열의 총 요소 수 출력: 6 print(arr.dtype) # 배열 요소의 자료형 출력: int64
-
배열 연산
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 배열 덧셈 print(a + b) # 출력: [5 7 9] # 배열 뺄셈 print(a - b) # 출력: [-3 -3 -3] # 배열 곱셈 print(a * b) # 출력: [ 4 10 18] # 배열 나눗셈 print(a / b) # 출력: [0.25 0.4 0.5 ] # 배열 요소별 제곱 print(a ** 2) # 출력: [1 4 9]
-
배열 인덱싱 및 슬라이싱
1 2 3 4 5 6 7 8
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 인덱싱 print(arr[0, 2]) # 출력: 3 # 슬라이싱 print(arr[1:, 1:]) # 출력: [[5 6] # [8 9]]
-
브로드 캐스팅
1 2 3 4 5 6 7 8 9
a = np.array([1, 2, 3]) b = np.array([[4], [5], [6]]) print(a + b) # 출력: [[5 6 7] # [6 7 8] # [7 8 9]]
- 함수
-
집계 함수
1 2 3 4 5 6
arr = np.array([1, 2, 3, 4, 5]) print(np.sum(arr)) # 배열 요소의 합 출력: 15 print(np.mean(arr)) # 배열 요소의 평균 출력: 3.0 print(np.min(arr)) # 배열 요소의 최솟값 출력: 1 print(np.max(arr)) # 배열 요소의 최댓값 출력: 5
-
선행대수 함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
mat1 = np.array([[1, 2], [3, 4]]) mat2 = np.array([[5, 6], [7, 8]]) # 행렬 곱 print(np.dot(mat1, mat2)) # 출력: [[19 22] # [43 50]] # 행렬 전치 print(np.transpose(mat1)) # 출력: [[1 3] # [2 4]] # 역행렬 print(np.linalg.inv(mat1)) # 출력: [[-2. 1. ] # [ 1.5 -0.5]]
-
판다스(Pandas)
-
설치 및 시작하기
1 2 3 4 5
# 콘솔에 설치 pip install pandas # import문 작성 import pandas as pd
-
데이터 구조
판다스는 주로 두 가지 데이터 구조를 사용
- 시리즈(Series): 1차원 배열
- 데이터프레임(DataFrame): 2차원 테이블
시리즈
- 시리즈는 1차원 배열과 같은 자료 구조로, 데이터의 순차적 리스트를 나타냄
- 각 데이터는 인덱스와 연관되어 있으며, 기본적으로 정수 인덱스를 사용합니다. 하지만 문자열 인덱스도 사용가능.
- 시리즈 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
import pandas as pd # 리스트를 사용하여 시리즈 생성 sr = pd.Series([17000, 18000, 1000, 5000]) print(sr) # 출력: # 0 17000 # 1 18000 # 2 1000 # 3 5000 # dtype: int64 # 인덱스를 지정하여 시리즈 생성 sr = pd.Series([17000, 18000, 1000, 5000], index=["피자", "치킨", "콜라", "맥주"]) print(sr) # 출력: # 피자 17000 # 치킨 18000 # 콜라 1000 # 맥주 5000 # dtype: int64
-
시리즈의 값과 인덱스 접근
1 2 3 4 5 6 7
# 시리즈의 값 print(sr.values) # 출력: [17000 18000 1000 5000] # 시리즈의 인덱스 print(sr.index) # 출력: Index(['피자', '치킨', '콜라', '맥주'], dtype='object')
데이터프레임 (DataFrame)
스프레드시트 같은 곳의 데이터 타입을 받아와서 사용할 때 주로 사용.
- 데이터 프레임이란?
- 데이터프레임은 2차원 테이블 구조를 가지는 데이터 구조로, 행(row)과 열(column)로 구성
- 엑셀 스프레드시트나 SQL 테이블과 유사한 구조를 가지며, 다양한 데이터 타입을 저장 가능.
- 데이터프레임은 여러 시리즈가 모인 형태로 보면 된다.
-
데이터프레임 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
# 리스트를 사용하여 데이터프레임 생성 data = [[1, 'Alice', 23], [2, 'Bob', 25], [3, 'Charlie', 22]] df = pd.DataFrame(data, columns=['ID', 'Name', 'Age']) print(df) # 출력: # ID Name Age # 0 1 Alice 23 # 1 2 Bob 25 # 2 3 Charlie 22 # 딕셔너리를 사용하여 데이터프레임 생성 data = {'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [23, 25, 22]} df = pd.DataFrame(data) print(df) # 출력: # ID Name Age # 0 1 Alice 23 # 1 2 Bob 25 # 2 3 Charlie 22
-
데이터 프레임의 속성
1 2 3 4 5 6 7 8 9 10 11 12 13
print(df.index) # 행 인덱스 출력 # 출력: RangeIndex(start=0, stop=3, step=1) print(df.columns) # 열 이름 출력 # 출력: Index(['ID', 'Name', 'Age'], dtype='object') print(df.values) # 값 출력 # 출력: # [[1 'Alice' 23] # [2 'Bob' 25] # [3 'Charlie' 22]]
- 데이터 조작 및 선택
-
필터링
1 2 3 4
print(df[df['Age'] > 23]) # 출력: # ID Name Age # 1 2 Bob 25
-
데이터 추가 1. 열추가
1 2 3 4 5 6 7
df['City'] = ['New York', 'Los Angeles', 'Chicago'] print(df) # 출력: # ID Name Age City # 0 1 Alice 23 New York # 1 2 Bob 25 Los Angeles # 2 3 Charlie 22 Chicago
-
데이터 추가 2. 행 추가
1 2 3 4 5 6 7 8 9
new_row = {'ID': 4, 'Name': 'David', 'Age': 24, 'City': 'San Francisco'} df = df.append(new_row, ignore_index=True) print(df) # 출력: # ID Name Age City # 0 1 Alice 23 New York # 1 2 Bob 25 Los Angeles # 2 3 Charlie 22 Chicago # 3 4 David 24 San Francisco
-
데이터 수정
1 2 3 4 5 6 7 8 9
df.loc[0, 'Age'] = 24 print(df) # 출력: # ID Name Age City # 0 1 Alice 24 New York # 1 2 Bob 25 Los Angeles # 2 3 Charlie 22 Chicago # 3 4 David 24 San Francisco
-
데이터 삭제 1. 열 삭제
1 2 3 4 5 6 7 8
df = df.drop('City', axis=1) print(df) # 출력: # ID Name Age # 0 1 Alice 24 # 1 2 Bob 25 # 2 3 Charlie 22 # 3 4 David 24
-
데이터 삭제 2. 행 삭제
1 2 3 4 5 6 7
df = df.drop(0, axis=0) print(df) # 출력: # ID Name Age # 1 2 Bob 25 # 2 3 Charlie 22 # 3 4 David 24
-
- 데이터 프레임 결합
-
concat 사용한 결합
여러 데이터프레임을 위아래로 또는 좌우로 결합 가능
1 2 3 4 5 6 7 8 9 10 11 12 13 14
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2']}) df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'], 'B': ['B3', 'B4', 'B5']}) result = pd.concat([df1, df2]) print(result) # 출력: # A B # 0 A0 B0 # 1 A1 B1 # 2 A2 B2 # 0 A3 B3 # 1 A4 B4 # 2 A5 B5
-
merge 사용한 결합
SQL의 JOIN 연산처럼 두 데이터프레임을 결합 가능
1 2 3 4 5 6 7 8 9 10
left = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 'A': ['A0', 'A1', 'A2']}) right = pd.DataFrame({'key': ['K0', 'K1', 'K3'], 'B': ['B0', 'B1', 'B3']}) result = pd.merge(left, right, on='key') print(result) # 출력: # key A B # 0 K0 A0 B0 # 1 K1 A1 B1
-
- 그룹화 및 집계
-
groupby를 사용한 그룹화
1 2 3 4 5 6 7 8 9 10 11 12
data = {'Team': ['A', 'B', 'A', 'B'], 'Points': [10, 20, 30, 40]} df = pd.DataFrame(data) grouped = df.groupby('Team') print(grouped.sum()) # 출력: # Points # Team # A 40 # B 60
-
집계함수 : 그룹화한 데이터에 대해 다양한 집계 함수를 적용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
print(grouped['Points'].mean()) # 출력: # Team # A 20.0 # B 30.0 # Name: Points, dtype: float64 print(grouped['Points'].sum()) # 출력: # Team # A 40 # B 60 # Name: Points, dtype: int64 print(grouped['Points'].min()) # 출력: # Team # A 10 # B 20 # Name: Points, dtype: int64 print(grouped['Points'].max()) # 출력: # Team # A 30 # B 40 # Name: Points, dtype: int64 print(grouped['Points'].count()) # 출력: # Team # A 2 # B 2 # Name: Points, dtype: int64
-
- 결측치 처리
-
결측지 확인
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
df = pd.DataFrame({'A': [1, 2, None], 'B': [4, None, 6], 'C': [None, 8, 9]}) print(df) # 출력: # A B C # 0 1.0 4.0 NaN # 1 2.0 NaN 8.0 # 2 NaN 6.0 9.0 print(df.isnull()) # 출력: # A B C # 0 False False True # 1 False True False # 2 True False False print(df.isnull().sum()) # 출력: # A 1 # B 1 # C 1 # dtype: int64
-
결측치 제거
1 2 3 4 5 6
df = df.dropna() print(df) # 출력: # Empty DataFrame # Columns: [A, B, C] # Index: []
-
결측치 대체
1 2 3 4 5 6 7 8
df = pd.DataFrame({'A': [1, 2, None], 'B': [4, None, 6], 'C': [None, 8, 9]}) df['A'] = df['A'].fillna(df['A'].mean()) print(df) # 출력: # A B C # 0 1.000000 4.0 NaN # 1 2.000000 NaN 8.0 # 2 1.500000 6.0 9.0
-
- 데이터 정렬
-
인덱스 기준
1 2 3 4 5 6 7
df = df.sort_index() print(df) # 출력: # A B C # 0 1.000000 4.0 NaN # 1 2.000000 NaN 8.0 # 2 1.500000 6.0 9.0
-
값을 기준
1 2 3 4 5 6 7 8
df = df.sort_values(by='A') print(df) # 출력: # A B C # 0 1.000000 4.0 NaN # 2 1.500000 6.0 9.0 # 1 2.000000 NaN 8.0
-
-
데이터 저장
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
import pandas as pd df = pd.DataFrame({'Team': ['A', 'B', 'A', 'B'], 'Point': [10, 20, 30, 40]}) group = df.groupby('Team') #print를 하면 주소 값만 출력된다 print(group.mean()) # 이렇게 해도 포인트밖에 없어서 출력은 되지만 기준을 정해주는 것이 좋다.\ print(group['Point'].mean()) print(group['Point'].count()) # csv와 엑셀 파일로 저장. df.to_csv('output.csv', index=False) df.to_excel('output.xlsx', index=False)
Leave a comment