매일공부

Python 데이터 분석 라이브러리 - Pandas 본문

Programming/Python

Python 데이터 분석 라이브러리 - Pandas

aram 2022. 8. 27. 00:38

Python Modeling library

  • NumPy 라이브러리
    : 동일한 데이터 유형의 값을 저장하는 고성능 다차원 배열 개체
    : 배열 및 벡터화에 대한 수학 연산이 용이
  • SciPy 라이브러리
    : NumPy 배열 객체를 기반 Matplotlib(시각화), Pandas(데이터정제) 및 SymPy와 같은 도구를 포함하는 스택의 일부
    : 선형 대수, 보간, 최적화, 통합 및 통계와 같은 효율적인 수학 루틴을위한 모듈이 포함
  • Matplotlib : 2D 시각화
  • Seaborn : 고급 기능을 갖춘 Matplotlib의 확장 > 높은 수준의 추상화, 다중 플롯 그리드 제공
  • Scikit-learn : 온갖 머신러닝 라이브러리가 있는 기계학습 라이브러리 
  • TensorFlow : 이미지 분류에 최적화되어 있는 라이브러리 > 대규모 신경망 만들 수 있도록 도와줌
  • Keras : 층 신경망 코드를 빌드하고 학습하기위한 TensorFlow의 고수준 API
  • Statsmodels : 기술 통계를위한 쉬운 계산과 통계 모델에 대한 추정 및 추론을 제공(선형 회귀, 상관 관계, OLS)
  • Plotly : 데이터를 클라우드 서버로 보내는 추가 기능도 제공(기본차트, 과학)

 

Pandas 라이브러리

  • 데이터 랭글링 또는 정리를위한 완벽한 도구
  • 데이터 랭글링
    : 다양한 data 소스를 통합&엑세스&분석할 수 있도록 정리하는 프로세스
    : 원천데이터를 시각화하고 머신러닝 또는 딥러닝으로 모델링 하기 위한 input data로 만들기 위한 사전 준비 과정의 데이터 정체작업
  • 빠르고 쉬운 데이터 조작, 읽기, 집계 및 시각화
  • R의 dataframe 데이터 타입을 참고
  • CSV파일 불러오기가 편리함
    > 서로 다른 여러 가지 소스(json, csv, xml, rdbms, txt, excel 등)으로부터 데이터를 "공통의 포맷"으로 정리

  • 판다스 설치 : $ pip install pandas
  • 판다스 사용 : import pandas as pd

  • 데이터 > 시계열(series) or 표(table)의 형태
  • 시리즈(Series) 클래스 데이터프레임(DataFrame) 클래스를 제공
  • 문자, 논리형, 숫자 모든 데이터타입이 들어갈 수 있음

 

시리즈(Series) 클래스

  • Series = 값(value; numpy의 1차원 배열) + 인덱스(index; 각 데이터의 의미 표시)
  • data 자체 = 값(value) 
  • 인덱스(index)
    - 문자열, 날짜, 시간, 정수 등도 가능
    - 지정X = 0부터 시작하는 정수값 자동 지정
    - list와 tuple 변환 > 정수형 위치 인덱스 자동 지정

  • .name 속성 : Serise data에 이름 부여
  • .index.name 속성 :  Serise index에 이름 부여
  • type(시리즈 변수) : <class 'pandas.core.series.Series'>
  • 벡터화 연산 가능 > 연산 자체는 Series의 값에만 적용 > index 값 변함X
     >> numpy처럼 vectoring가능

  • 배열인덱싱(s[1]) OR 인덱스 라벨(s["부산" / "2"]) 이용한 indexing / slicing  가능
  • 자료순서 변경, 특정 자료만 선택 가능
  • 문자열 라벨로 슬라이싱 s["부산" : "대구"] end 값도 포함
  • 영문 문자열 라벨 값 => 온점( . )으로 인덱스 접근 가능 >> s0.a

 

Series vs Dict

  • Series = 인덱스 라벨 값을 키(key)로 가지는 딕셔너리 자료형
  • in 연산, itmes 메서드 사용 가능
  • 데이터 순서 보장X
  • 순서 지정 > 인덱스를 리스트로 지정
  • (Serise1 - Serise2) => 연산하는 경우, 같은 인덱스 data 대해서만 차이 구함

  • .notnull() : NaN이 아니면 True /  NaN이면 False
  • NaN > float 자료형에서만 가능 > 연산 결과에 NaN 있으면 모두 float 자료형

  • 데이터 갱신&추가 : s["대구"] = 1.41
  • 데이터 삭제 : del 명령어

 


데이터프레임(DataFrame) 클래스

  • 2차원 객체 생성 > 2차원 벡터 또는 행렬(matrix)
  • 행과 열 구조>  테이블 형식의 데이터 (tabular, rectangular grid 등으로 불림)
  • 공통 인덱스를 가지는 열 시리즈(column series)를 딕셔너리로 묶어놓은 것
  • 각 열(column)마다 자료형이 다를 수 있음
  • dataframe의 3요소 - 컬럼(column), 데이터(row), 인덱스(index)

  • dict > DataFrame 변환 : pd.Dataframe(2차원 배열, index=, column=열 이름 배열)
  • 인덱스 수정 : pd.Dataframe객체.index=새로운 행 인덱스 배열
  •  인덱스 수정 : pd.Dataframe객체.column=새로운 열 이름 배열

  • 각각 이름 지정
    .index.name = 이름
    .columns.name = 이름

  • 열(Series) 단위 > 데이터 갱신, 추가, 삭제(del) 가능
  • dataframe객체.컬럼라벨인덱스 사용 가능 ex)print(df.지역)

  • 열 인덱싱
    - 열 라벨(column label) 값 하나만 넣으면 > 시리즈 객체 반환

    - 열 인덱스 = 문자열 라벨
         > 정수인덱스X(열 인덱싱 불가)
         > 라벨 인덱싱 > 열 Series 반환
         > 라벨 List 인덱싱 > 열 Dataframe 반환
         > 정수 인덱싱 slice > Dataframe 반환
  • 행 인덱싱
    - 항상 슬라이싱(slicing)
    - 라벨(문자) 인덱스도 라벨 슬라이싱 가능
    - 라벨(문자) 인덱스 = start~end까지(end포함)

 

Dataframe 데이터 확인

  • .rank : 순위 반환 https://ponyozzang.tistory.com/612
  • .ndim : 차원 반환(Dataframe은 2차원으로 2 반환)
  • .shape : 데이터 (행, 열) 크기 반환
  • .info() : 데이터에 대한 전반적인 정보 출력 > null 존재여부 확인 가능
  • .head(self, n=5) : 상단 5개(기본값) 데이터 출력 > 내부에 숫자 지정 가능
  • .tail(self, n=5) : 하단 5개(기본값) 데이터 출력 > 내부에 숫자 지정 가능
  • .describe() : 요약 통계량 출력(최소, 최대, 각 사분위  값 등 알 수 있음)

 

Dataframe 속성을 활용한 행/열 인덱스 확인(접근)

  • .index[] : 지정한 인덱스 값 확인
  • .columns[] : 지정한 값 확인
  • .values[][] : 지정한 values 값 확인

Dataframe 속성을 활용한 행/열 인덱스 변경&추가

  • Dataframe객체.rename(columns={'기존값':'변경값'}, inplace={'기존값':'변경값},index={'기존값':'변경값})
    : 기존 행/열을 새로운 값으로 수정&추가

  • 지정한 값을 변경값으로 수정 & 변경값으로 전체 행/열 추가
    - Dataframe객체[기존값] = 변경값
    - Dataframe객체.loc[기존값] = 변경값

Dataframe 인덱스 설정 및 제거 & 재정의

  • .set_index() : 기존의 행 인덱스 제거 > 데이터 열 중 하나를 인덱스로
  • .reset_index(name=, inplace=, drop=)
    :
     기존의 행 인덱스 제거 > 인덱스를 데이터 열로 추가
    : 행 인덱스를 기본 정수 인덱스로 변경
    : drop=True 기존 인덱스 삭제

  • Dataframe객체.reindex() = index 재정의(0부터 새롭게 지정)
      > 추가되는 부분은 모두 NaN값
      > 추가되는 부분을 채우려면 (fill_value=채울값) 사용

Dataframe 컬럼, 로우 인덱스 추가

  • Dataframe객체.append() = row 추가

Dataframe 삭제

  • Dataframe객체.drop(인덱스|배열, axis=, inplace=)
     > 0 = 행 // 1 = 열 삭제
     새로운 객체 반환
     > 여러개의 행과 열 삭제 > 리스트 입력
     > inplace=True
     :  원본 객체 직접 변경
  • del

  • Dataframe객체.drop_duplicates(subset=, keep=) : unique한 값 1개만 남기고 중복된 row 제거
     > subset = 처리할 열
     > keep = 중복데이터 발견이 어떤 데이터를 남길지 결정
       ('fritst'=처음 남기고 삭제 ||  'last'=마지막 남기고 남기고  ||  False=전부 삭제)

 

인덱서(indexer) 속성

  • loc
     - 라벨값 기반의 2차원 인덱싱
     - 범위 끝 포함 범위 지정 가능
     - df.loc[행 인덱싱값]
     - df.loc[행 인덱싱값, 열 인덱싱값]
        >> 행 인덱싱 값 = 정수 or 행 인덱스데이터
        >> 열 인덱싱 값 = 라벨 문자열
    - loc 인덱서가 없는 경우 : 인덱싱 불가능

  • loc 인덱싱 값
    = 인덱스데이터 
    = 인덱스데이터 슬라이스
    = 인덱스데이터 리스트
    = 같은 행 인덱스를 가지는 불리언 시리즈 (행 인덱싱의 경우)
    = 또는 위의 값들을 반환하는 함수

  • iloc 
     - 정수형 위치 인덱스(integer position) > 순서를 나타내는 정수(integer) 인덱스만 받음
     - 순서를 나타내는 정수 기반의 2차원 인덱싱
     - 범위 끝 제외 범위 지정 가능
     - df.iloc[행 인덱싱값]
       df.iloc[행 인덱싱값, 열 인덱싱값]

  • indexer 속성 : https://bit.ly/3Cz2jE4

 

Dataframe 데이터 조작

  • .count() : 각 열마다 데이터 개수 반환, NaN 값 제외 > 누락값 찾을 때 용이
  • .value_counts()
     : Series - 각각의 값이 나온 횟수 셀 수 있음
     : Dataframe - 각 열마다 별도 적용(메서드 없음)

 

Dataframe 데이터 정렬

  • DataFrame객체.sort_index()인덱스 값 기준 정렬
    DataFrame객체.sort_index(axis=1) =
    인덱스 값 기준 정렬
  • DataFrame객체.sort_values() : 특정 열 값 기준 정렬, NaN 값은 가장 마지막
          > (by=인수) 정렬 기준 열 지정, 인수 = 리스트 : 첫번째 열 기준 정렬 후, 다음 열은 동일값 정렬
  • (ascending=False) 내림차순 정렬

 

Dataframe 통계함수

  • .sum() : 기준으로 합계 / .sum(axis=1) 기준으로 합계
  • .idxmin() : .min()의 index 반환
  • .idxmax() : .max()의 index 반환
  • .mean() : 평균
  • .median() : 중앙값
  • .unique() : 유일값 확인

 

Dataframe 행이나 열 단위 복잡한 연산 처리

  • .apply()
    : 행 또는 열을 받는 함수를 전달하면 각 열(또는 행) 데이터에 함수를 반복 적용
    : (axis=0 or 생략) 열에 적용  / (axis=1) 행에 적용  
    : 각 열에 대해 어떤 값이 얼마나 사용되어나 > value_counts 함수를 사용

  • .isnull() = 결측치(NaN) 이면 True
    .dropna(subset=['열이름'])
    = 결측치(NaN) 데이터 삭제
    .fillna(채울값, inplace=)
    = NaN 값을 원하는 값으로 채울 때 사용

  • .astype() = 전체 데이터의 자료형 변경

  • .cut()
    -
    실수 값을 크기 기준 > Categorical 클래스 객체 반환
    -cut(데이터, bins, labels=)
     >> bins : 카테고리를 나누는 기준값
     >> labels= : 경계선 이름
    - 영역을 넘는 값 > NaN 처리
    - Categorical 클래스 객체
       > 카테고리categories 속성 = 라벨 문자열 가짐
       > codes 속성 = 정수로 인코딩한 카테고리 값 가짐
  • .qcut()
    - 실수 값을 크기 기준 > 카테고리 값으로 변환
    - 구간 경계선을 지정X > 데이터 개수가 같도록 지정한 수의 구간으로 나눔

 

Dataframe 행과 열을 서로 맞바꿈(전치)

  • DataFrame객체.T = 전치(transpose) 행렬 반환
  • DataFrame객체.transpose()

 

* 내용참고&출처 : 태그의 수업을 복습 목적으로 정리한 내용입니다.

Comments