Pandas/DataFrame 복습

김홍찬·2023년 1월 17일

DataFrame 개요

  • 표(table-행렬) 를 다루는 Pandas의 타입.
  • 분석할 데이터를 가지는 판다스의 가장 핵심적인 클래스이다.
  • 행(row)와 열(column) 으로 구성되 있다.
  • 각 행과 각 열은 식별자를 가지며 Series와 같이 두가지 종류가 있다.
    • 순번
      • 양수, 음수 index 두가지를 가진다.
      • 컬럼도 내부적으로는 순번으고 관리되지만 조회할 때 사용할 수는 없다.
    • 이름
      • 명시적으로 지정한 행과 열의 이름을 말한다.
      • 행의 이름은 index name이라고 하고 열의 이름은 column name이라고 한다.
      • index name과 column name은 중복될 수 있다.
      • 명시적으로 지정하지 않으면 양수 순번이 index, column 이름으로 설정된다.
  • 하나의 행과 하나의 열은 Series로 구성된다.
  • DataFrame 객체는 직접 데이터를 넣어 생성하거나 데이터 셋을 파일(csv, 엑셀, DB 등)로 부터 읽어와 생성한다.

dataframe 생성

pd.DataFrame(data[index=None, columns=None])

  • data
    • DataFrame을 구성할 값을 설정한다.
      • Series, list, ndarray를 담은 2차원 배열
      • column 이름을 key로 column의 값을 value로 하는 dict
    • index
      • index 이름으로 사용할 값 배열로 설정
    • columns
      • column 이름으로 사용할 값 배열로 설정

예시)

import numpy as np
import pandas as pd

# 딕셔너리를 이용해 생성.
# key: 컬럼명, value:  그 컬럼의 값들을 1차원 자료구조로 설정.
# value의 리스트의 크기는 같아야 한다.

dic = {
    'id':['id-1', 'id-2', 'id-3', 'id-4', 'id-5'], 
    'korean':[100, 50, 70, 60, 90],  
    'english':[90, 80, 100, 60, 40]
}
grade = pd.DataFrame(dic)
grade


     id  korean  english
0  id-1     100       90
1  id-2      50       80
2  id-3      70      100
3  id-4      60       60
4  id-5      90       40
# 2차원 자료구조를 이용해서 생성

np.random.seed(0)

# 0 ~ 10-1 사이의 난수로 5행, 3열의 행렬 생성
data = np.random.randint(10, size=(5,3))  

data_df = pd.DataFrame(data, columns=['AA', 'BB', 'CC'], 
                       index=['가', '나', '다', '라', '마'])
data_df

	AA	BB	CC
가	5	0	33	7	93	5	24	7	68	8	1

dataframe의 객체를 파일에 저장

DataFrame객체는 다양한 형식의 파일로 저정할 수 있다.

  1. csv 파일로 저장

DataFrame객체.to_csv(파일경로,sep=',', index=True, header=True, encoding)

  • 텍스트 파일로 저장
  • 파일경로: 저장할 파일경로(경로/파일명)
  • sep : 데이터 구분자
  • index, header: 인덱스/헤더 저장 여부
  • encoding: 기본-UTF-8
  1. 엑셀로 저장

DataFrame객체.to_excel(파일경로, index=True, header=True)

  1. 기타 형식

DataFrame객체.to_pickle(파일경로, index=True, header=True)

  • pickle(pkl)
    • 텍스트 상태의 데이터가 아닌 파이썬 객체 자체를 dict,list,typle같은 형태로 필요한 부분을 저장하는 것
    • 빠르다는 장점이 있지만 안전에 유의해야 한다.

DataFrame객체.to_html(파일경로, index=True, header=True)


파일로 부터 데이터셋을 읽어와 생성하기

pd.read_csv(파일경로, sep=',', header, index_col, na_values, encoding)

  • index_col=정수,컬럼명
    • index 명으로 사용할 열이름(문자열)이나 열의 순번(정수)을 지정.
    • 생략시 0부터 자동증가하는 값을 붙인다.
  • na_values
    • 읽어올 데이터셋의 값 중 결측치로 처리할 문자열 지정.

DataFrame의 기본 정보 조회 메소드

  • shape
  • info()
  • head()
  • tail()
  • isnull().sum()
    • .sum()을 붙이면 True(결측치)를 1로 하여 합산한 결과를 보여준다.
      • 결측치가 10개면 10
  • describe() : 숫자형-기술통계값, 범주형-총개수, 고유값들, 최빈값

컬럼이름/행이름 조회 메소드

  • DataFrame객체.columns
    • 컬럼명 조회
    • 컬럼명은 차후 조회를 위해 따로 변수에 저장하는 것이 좋다.
    • slicing도 가능하다.
  • DataFrame객체.index
    • 행명 조회

컬럼이름/행이름 변경 메소드

  • columns와 index 속성으로는 통째로 바꾸는 것은 가능하나 일부만 선택해서 변경하는 것은 안된다.
    - df.columns = ['새이름','새이름', ... , '새이름']
    - 가능
    - df.columns[1] = '새이름'
    - 불가능 (개별적으로 변경은 안된다.)

개별 컬럼이름/행이름 변경 메소드

DataFrame객체.rename(index=행이름변경설정, columns=열이름변경설정, inplace=False)

  • 변경한 DataFrame을 반환
  • 변경설정: 딕셔너리 사용
    • {'기존이름':'새이름', ..}
    • inplace: 원본을 변경할지 여부(boolean)
    예시)
grade
 	ID	  국어	영어
0  id-1   100	  90
1  id-2   50	  80
2  id-3   70	  100
3  id-4   60	  60
4  id-5   90	  40
 
 # 국어->KOREAN, 영어->ENGLISH
 
new_columns = {
    "국어":"KOREAN", 
    "영어":"ENGLISH"
}
new_index = {
    1:'일', 
    3:'삼'
}
grade.rename(columns=new_columns, index=new_index, inplace=True)

grade
	ID	KOREAN	ENGLISH
0	id-1	100	   90id-2	50	   80
2	id-3	70	   100id-4	60	   60
4	id-5	90	   40

특정 컬럼을 행의 index 명으로 사용 메소드

DataFrame객체.set_index(컬럼이름, inplace=False)

  • 열이 index명이 되면서 그 컬럼은 데이터셋에서 제거된다.

    DataFrame객체.reset_index(inplace=False)

  • index를 첫번째 컬럼으로 복원


특정 행 또는 열 삭제 메소드

DataFrame객체.drop(columns, index, inplace=False)

  • columns : 삭제할 열이름 또는 열이름 리스트
  • index : 삭제할 index명 또는 index 리스트

DataFrame객체.drop(labels, axis, inplace=False)

  • labels : 삭제할 컬럼명,인덱스 명 또는 리스트
  • axis : 열 삭제시 1 , 행 삭제시 0

열 추가 하기

  • 새로운 열을 지정 후 값을 대입하면 새로운 열을 추가할 수 있다.
    • 보통 파생변수를 만들 때 사용한다.

  • 열 추가
    • df['새열명'] = 값
    • 마지막 열로 추가된다.
    • 하나의 값을 대입하면 모든 행에 그 값이 대입된다.
    • 다른 값을 주려면 배열에 담아서 대입한다.

  • 열 삽입
    • df.insert(삽입할 위치 index, 삽입할 열이름, 값)

  • 파생변수생성
    • 기존 열들의 값을 이용해서 만든 열을 파생변수라고 한다.
    • 벡터화 연산을 이용하여 값 대입한다.
    • df['새열이름'] = 기존 열들을 이용한 연산

다양한 열선택 기능을 제공하는 메소드들

select_dtypes(include=[데이터타입,..], exclude=[데이터타입,..])

  • 전달한 데이터 타입의 열들을 조회.
    • include : 조회할 열 데이터 타입
    • exclude : 제외하고 조회할 열 데이터 타입

filter (items=[], like='', regex='')

  • 매개변수에 전달하는 열의 이름에 따라 조회
    • 각 매개변수중 하나만 사용할 수 있다.
  • items = [컬럼명들, ..]
    • 리스트와 일치하는 열들 조회
    • 이름이 일치 하지 않아도 Error 발생안함.
  • like = '부분일치문자열'
    • 전달한 문자열이 들어간 열들 조회
    • 부분일치 개념
  • regex = '정규표현식'
    • 정규 표현식을 이용해 열명의 패턴으로 조회

query() 를 이용한 boolean indexing

  • query(조회조건)
    • sql의 where 절의 조건 처럼 문자열의 query statement를 이용해 조건으로 조회
    • boolean index에 비해
      • 장점: 편의성(문자열로 query statement를 만들므로 동적 구문 생성등 다양한 처리가 가능)과
        가독성이 좋다.
      • 단점: 속도가 느리다.
  • 조회조건 구문
    • "컬럼명 연산자 비교값"
  • 외부변수를 이용해 query문의 비교값을 지정할 수 있다.
    - query 문자열 안에서 @변수명 사용
    - f string이나 format() 함수를 이용해 query를 만들 수도 있다.

query 함수 연산자

  • 비교 연산자
    • ==, >, >=, \<, \<=, !=
  • 결측치 비교
    • 컬럼.isna(), isnull()
    • 컬럼.notna(), notnull()
  • 논리 연산자
    • and, or, not
  • in 연산자
    • in, ==
    • not in, !=
    • 비교 대상값은 리스트에 넣는다.
  • Index name으로 검색
    • 행의 index 이름으로 검색
  • 문자열 부분검색(sql의 like)
    • 컬럼명.str.contains(문자열): 문자열을 포함하고 있는
    • 컬럼명.str.startswith(문자열): 문자열로 시작하는
    • 컬럼명.str.endswith(문자열): 문자열로 끝나는
    • 문자열 부분검색을 할 컬럼에 결측치(NaN)이 있으면 안된다.
profile
바쁘다 바빠

0개의 댓글