티스토리 뷰

Data/Analytics

[DA] Numpy & Pandas

jeong_reneer 2022. 1. 13. 21:47

1. Numpy

1) Numpy (Numerical Python)

- Python에서 벡터, 행렬 등 수치 연산 수행하는 선형대수 라이브러리

- 벡터 및 행렬 연산에 있어 매우 편리 기능 제공

- 데이터 분석을 할 때 사용되는 라이브러리인 Pandas와 Matplotlib의 기반

- 기본적으로 array(행렬) 단위로 데이터 관리. 이에 대한 연산 수행

 

2) Array 정의 및 사용

(1) 정의

 

(2) .shape / .ndim / .size : 배열의 모양 / 차원 수 / 원소 개수

- 각 차원 = '축(axis)', 축의 개수 = '랭크(rank)'

- shape = 각 차원(축)의 크기(길이)

 

(3) .dtype : 자료형

- array는 모든 원소가 같은 자료형 가짐

- 자료형 직접 지정해줄 수 있음 By dtype 옵션 or .astype()

- Numpy에서 사용되는 자료형 (자료형 뒤의 숫자는 비트 크기)

int(8, 16, 32, 64) 부호가 있는 정수
uint(8, 16, 32, 64) 부호가 없는 정수
float(16, 32, 64, 128) 실수
complex(64, 128, 256) 복소수
bool 불리언
string 문자열
object 파이썬 오브젝트
unicode 유니코드

 

(4) zeros[ones] : 입력받은 형태만큼 인자가 0[1]으로 채워진 행렬 만듦

 

(5) arrange : 범위 지정 (파이썬의 range와 비슷)

 

(6) reshape(행 수, 열 수) : 개수 유지하면서 재배열

가로줄 = 행, 세로줄 = 열

 

reshape(-1) : 원래 배열의 길이와 남은 차원으로부터 추정하여 재배열

① 2차원 배열 : shape = (행, 열)

array_reshaped.shape = (2, 4) → (4, -1) = (4, 2) & (-1, 4) = (2, 4)

② 3차원 배열 : shape = (차원, 행, 열)

array4.shape = (2, 3, 2) → (2, 2, -1) = (2, 2, 3)

array4는 2개의 (3행, 2열) 2차원 배열로 이루어진 3차원 배열

 

3) Array 연산

(1) 원칙적으로 shape 같아야 연산 가능 ← 각 array의 같은 자리에 있는 값들끼리 element-wise 연산 

① 평균 : np.mean(arr)

② 덧셈 : arr1 + arr2 OR np.add(arr1, arr2)

③ 뺄셈 : arr1 - arr2 OR np.subtract(arr1, arr2)

④ 곱셈 : arr1 * arr2 OR np.multiply(arr1, arr2)

내적곱 : .dot

 

 

⑤ 나눗셈 : arr1 / arr2 OR np.divide(arr1, arr2)

⑥ 최댓값 : np.maximum(arr1, arr2)

 

(2) BroadCasting : 서로 크기가 다른 numpy array 연산 가능하게 함, 스칼라와도 가능

차원이 같을 경우, 작은 배열이 큰 배열의 모양으로 확대되어 shape을 같게 맞춰준 후 element-wise 연산

※ 차원이 다를 경우,  차원이 작은 쪽의 shape이 우측 정렬했을 때 완전히 포개어지는 경우만 Broadcasting 가능

* keepdims = True를 통해 보완 가능

 

4) Array 인덱싱

- 원소의 index는 0부터 시작

- 각 차원에 대해 슬라이싱 가능

(슬라이스된 배열은 원 데이터와 동일한 데이터 가리키므로 변경 시 원 데이터도 변경됨)

 

(1) 1차원 데이터 인덱싱

 

(2) 2차원 데이터 인덱싱

 

(3) Boolean array 인덱싱 : Boolean array를 인덱스에 넣어 True인 원소만 접근 가능

 

(4) Integer array 인덱싱 : Integer array를 인덱스에 넣어 지정된 인덱스의 원소에 접근

ndarray.flatten() : n차원 배열을 1차원 배열로 만드는 메서드

 

5) 자주 쓰이는 Numpy 함수

※ axis

" axis = 0 : 가장 바깥 차원 방향, axis = 1 : 그 다음 차원 방향 "

 

[2차원 행렬]

ex) (2, 3) 행렬 = (3,) 벡터 2개 있는 것 → 2가 3보다 큰 차원

axis = 0 (수평축) : 행(row) 방향, 즉 위에서 아래로 연산 → 행(row) 숫자 사라짐

axis = 1 (수직축) : 열(col) 방향, 즉 왼쪽에서 오른쪽으로 연산 → 열(column) 숫자 사라짐

 

[3차원 행렬]

ex) (3, 2, 4) 행렬 = (4,) 벡터 2개로 이루어진 (2, 4) 행렬이 3개 있는 것 → 3(가장 바깥 차원) > 2 > 4

axis = 0 : 가장 바깥 차원인 채널(channel) 방향으로 연산

 

(1) concatenate(arr1, arr2, axis = 0) : 결합

※ 가로, 세로 결합에 따라 row, column 갯수가 맞아야 결합 가능

axis = 0 → 행(row)을 기준으로 (가로줄로) 결합

axis = 1 → 열(column)을 기준으로 (세로줄로) 결합

 

(2) split(arr, n) : n개로 분할

 

(3) sum : 원소별 합

axis = 0 : 행(row)방향, 즉 위에서 아래로 합 → 행(row) 숫자 사라짐

axis = 1 : 열(column)방향, 즉 왼쪽에서 오른쪽으로 합 → 열(column) 숫자 사라짐

※ keepdims = True : 행 or 열 숫자 사라지는 부분에 1을 채워 넣어 차원이 축소되는 것 방지→ Broadcasting 가능

 

(4) cumsum : 원소별 누적합

 

 

(5) delete(arr, obj, axis=None) : 요소 삭제

arr : 삭제할 배열

obj : 몇 번째를 삭제 (인자로 배열도 가능)

axis : 어느 축에서 삭제

- axis = 0 : 행 제거, axis = 1 : 열 제거

- axis 지정해주지 않으면 배열이 flatten 되고 지정한 obj 요소가 삭제됨

 

(6) insert(arr, obj, values, axis=None) : 값을 추가

- axis 지정해주지 않으면, 배열이 flatten 되고 obj 인덱스에 values 가 추가됨

- values를 단순 스칼라 값으로 넣어주면, 동일한 값으로 채워짐

 * 서로 다른 값들로 채우고 싶다면(배열 넣고싶다면), values를 axis의 shape에 맞춰 배열 넣어주기

 

(7) append(arr, values, axis=None): 값을 추가

insert : 특정 인덱스(obj)에 원하는 배열(values) 삽입

append : 마지막 인덱스에 원하는 배열(values) 삽입

- axis를 명시하면, values의 차원 수와 arr의 차원 수가 동일해야함 (빈 차원도 맞춰 줘야함)

- axis 지정해주지 않으면, 배열이 flatten 되고 마지막 부분에 values 추가됨 (차원 달라도O)

 

 

 

2. Pandas

1) Pandas

- Python에서 사용하는 데이터분석 라이브러리

- 행과 열로 이루어진 데이터 객체 만들 수 있음

- 크게 2가지 데이터 타입 존재 (Series, DataFrame)

 

2) Series

  • Series : Index와 Value로 이루어진 데이터 타입 (1차원)

(1) pd.Series([ ], index = [ ]) : 생성 

  ① 값만 넣기 : index 지정 안하면 자동으로 0부터 숫자

  ② 딕셔너리로 생성 : index도 한번에 원하는 것으로 설정 가능

 

(2) 확인 Method

  ① .values : 값 확인

  ② .index : 인덱스 확인

  ③ .dtypes : 자료형 확인

  +) .name : 전체 Series명 / Index명 설정 가능

      .index : index 변경 가능

 

 

(3) Indexing

- Index로 Indexing : .<Index 명> or ['<Index 명>']

- 여러개 한번에 Indexing 가능 (Index명 or Index 번호로 가능)

- Offset Index (슬라이싱) 사용 가능

 

(4) Data Filtering

 

(5) Series 연산

 

(6) Series 변형

  ① .concat

 

  ② .drop

 

(7) Series 결측치(NaN) 처리

.notnull() OR.dropna() : NaN 제외한 나머지 값들만 남김

.fillna(Series.mean()) : NaN 제거한 자리에 평균값 채워넣음

 

2) DataFrame

  • DataFrame : Index와 Value와 Column으로 이루어진 데이터 타입 (2차원)
  • Column은 Series로 이루어짐, 엑셀의 테이블 형태와 유사
  • column : 열(세로) / row : 행(가로)

(1) DataFrame 생성 순서

  ① columns 생성 : pd.DataFrame(columns=[" ", " "])

&amp;amp;amp;amp;amp;amp;nbsp;

  ② 데이터 채우기 : 각 column에 대해 리스트 or 딕셔너리로 생성

+) 위와 같이 index를 옵션으로 지정할 수 있으며,

   아래와 같이 set_index로 특정 column을 index로 지정할 수도 있음

 

(2) DataFrame 인덱싱 (접근)

- Column명 / 조건 / Index(행) 슬라이싱으로 접근 ..... df["A":"A"]

- Index로 바로 접근 X .....df["A"] (X)

- loc : Index 명으로 바로 접근 ..... df.loc["A"]

- iloc : Index 자리수로 접근 (0부터 시작) ..... df.iloc[0]

 

(3) DataFrame 추가, 변경, 삭제, 병합

  ① 추가, 변경

  loc : Index 지정해서 변경, 추가 가능, 특정 부분만 변경 가능

  df["<column명>"][<Index>] : 특정 부분만 변경 가능

 

  ② 삭제

  drop(<Index> , inplace=True, axis=0) : Row(행, 가로줄) 삭제

   - drop 함수는 원본데이터를 변형하지 않으므로 새로운 데이터 변수 할당해줘야함

   - inpace=True 옵션 : 원본데이터 자체를 변경할 수 있음 (해당 데이터프레임에서 삭제)

   - axis=0 옵션 : Row 삭제 (default 옵션)

 

  reset_index() : Index 재정렬 (drop=True 옵션 주면 삭제된 Index 저장 X)

   - drop=True 옵션 안주면 원래 index 였던 것들이 index라는 새로운 column으로 추가됨

 

  drop("<Column명>" , inplace=True, axis=1) : Column(열, 세로줄) 삭제

 

  ③ 병합

  pd.concat([df1, df2], axis=0, join='outer', ...) : 단순 병합

   - axis=0 : 행으로 결합

   - axis=1 : 열로 병합 → 행의 index가 다른 경우에는 NaN 값 반환

   - join 옵션 : 결합 방법 지정 (default = 'outer')

       join = 'outer' : 합집합 (나와있는 모든 원소 표시)

       join = 'inner' : 교집합 (두 데이터에서 공통적으로 있는 부분만 표시)

  

pd.merge(left_df, right_df, how='inner', on='<Column명>') : 두 데이터의 공통 항목(key값)을 기준으로 병합

   - how 옵션 : 결합 방법 지정 (default = 'inner')

       how = 'outer' : key 값이 한 데이터프레임에만 있어도 표시

       how = 'inner' : 두 데이터에서 key 값이 공통적으로 있는 것만 표시

       how = 'left' : 왼쪽 df의 'on' 기준으로 그대로 두고 ,오른쪽df에서 겹치는 부분만 가져와 병합

       how = 'right' : 오른쪽 df의 'on' 기준으로 그대로 두고, 왼쪽 df에서 겹치는 부분만 가져와 병합

      → 값이 없는 경우에는 NaN 값 반환

 

(4) 데이터 읽기, 저장

pd.read_csv('<filepath>', usecols=["c1", "c2 ", "c3 "], nrows=10, index_col = "c1") : 데이터 읽기

- usecols : 사용할 컬럼들

- nrows : 가져올 행의 개수

- index_col : 인덱스로 지정할 컬럼명

 

.to_scv("<저장할 파일명>", index = True) : 다시 데이터 저장

- index = False로 하지 않으면 기존 인덱스가 새로운 컬럼으로 저장됨

 

.shape : 데이터의 row, column 길이 확인

.columns : 컬럼명 확인

.head() : 데이터 맨 앞부분 확인 (default 5개, 개수 지정 가능)

.tail() : 데이터 맨 뒷부분 확인 (default 5개, 개수 지정 가능)

.astype('<dtype>') : 데이터 타입 변경

.info() : NaN, 데이터 타입, 전체 데이터 수 등 정보 확인

.describle() : '수치형' 통계값 확인

 

 

(5) Pandas 함수

apply : (사용자 지정) 함수 적용

 

lambda : 사용자 지정 함수 간단하게 만들 수 있음

 

sort_values(by='<칼럼명>', ascending = True) : 원하는 칼럼을 선택해 그것을 기준으로 오름차순 정렬

 

null 값 확인 및 처리

.isnull() : null 값 확인

.notnull() : null 값 아닌 것 확인

.sum() : 해당 값 개수 세기

 

결측치 제거

.dropna() : 하나라도 null값 있으면 해당행 전체 삭제

.dropna(how='all') : 전체가 다 null여야 해당행 삭제

 .dropna(inplace=True) : null drop한 채로 저장

.dropna(axis=1) : null값인 칼럼(열) 자체를 다 삭제

 

.unique() : 특정 열이 어떤 값들로 구성되어 있는지 확인

 

.value_counts() : unique 값들이 각각 얼마나 있는지 확인

 

.groupby("<칼럼명>").size() : size를 통해 해당 칼럼의 데이터를 모은 후 개수 확인

- 특정 열(들)을 기준으로 데이터프레임을 묶어주는 함수

- 2가지 칼럼 기준으로 groupby 가능

- 기준 칼럼, mean() 구하는 칼럼 지정 가능

- .agg 통해 다양한 통계 낼 수 있음 (min, max, mean, sum, median)

 

'Data > Analytics' 카테고리의 다른 글

[DA] WordCloud  (0) 2022.02.10
[DA] NLP Pipeline - NLTK & KoNLPy  (0) 2022.02.09
[DA] FE (Feature Engineering)  (0) 2022.01.18
[DA] EDA & 시각화  (0) 2022.01.17
댓글
공지사항