22.10.19 - 데이터 분석(DataFrame)

LaMelo·2022년 10월 21일
0

jupyter

목록 보기
22/29

DataFrame 생성

  • 2차원 배열과 유사한 자료형
  • 다차원 리스트, 딕셔너리 자료형으로 데이터 구성 가능
  • 관계형 데이터베이스의 테이블 구조, excel/csv 데이터 구조와 유사
  • 하나의 컬럼은 하나의 Series로서 하나의 Dataframe은 여러 개의 Series 묶음으로 구성됨
  • index 특징
    - row index(행 인덱스) : 기본 숫자형 인덱스가 아닌 새롭게 지정한 로우명(라벨) 인덱스를 사용해도 기본 숫자형 인덱스를 함께 사용할 수 있음
    - column index(열 인덱스) : 새롭게 컬럼명(라벨) 인덱스를 사용하면 기본 숫자형 인덱스는 사용할 수 없음

특징

  • 다차원 자료형, 딕셔너리 자료형을 사용
  • 주의점 : 자료형에 따라서 아이템 길이 이슈 발생
  • 다차원 리스트 : 아이템 길이가 동일 / 서로 다른 타입
  • 딕셔너리 : 아이템 길이가 동일 / 서로 다른 타입
  • 데이터프레임의 셀(튜플)에는 모든 데이터 타입 및 여러 타입 혼합 가능
    • 다차원 리스트 : 아이템 개수 3개, 하위 아이템 개수 4개
    • 데이터프레임에 저장하기 : 자료는 반드시 2차원 자료여야 한다.
      • 구조 :
        • 아이템 3개 : 행 3 줄 => df에 저장하는 데이터 개수
        • 하위 아이템 4개 : 열 4줄
    • 아이템의 길이가 다른 경우
      • 최대 길이의 행을 기준으로 df 구조가 생성됨
      • 길이가 모자란 튜플(셀) : NaN으로 채워짐
  • 중요한 점은 생성에 있어 컬럼명부터 맞춰놓고 자료 값을 집어넣어야 한다는 것이다. 로우에 맞춰서 0, 1, 2의 자료는 무엇무엇으로 작성해도 에러가 날 뿐이다. (이는 판다스의 목적이 자료를 시각화 혹은 도표화하는 것이고 이미 널리 쓰이는 csv와 excel 자료들을 손쉽게 활용하기 위한 규칙인듯 하다.(컬럼 우대))
    • 3컬럼 4로우 자료만들기
  • !! 중요 !! 데이터프레임 생성시
    리스트형 자료들은 길이가 달라도 NaN 처리가 되지만 딕셔너리형 자료들은 길이가 다르면 에러 출력이 된다.
    • 에러 출력 : All arrays must be of the same length라는 경고창이 뜨게 된다.
  • 딕셔너리를 이용했을 때 컬럼 순서를 변경해서 df 생성이 가능하며 없는 컬럼명을 전달하는 경우 없는 컬럼명의 자료들은 NaN 생성 처리된다.
    • 이 경우에도 딕셔너리 data와 일치하지 않는 index 개수를 전달하는 경우 에러를 출력하게 된다.
  • 인덱스는 에러가 나는 반면 컬럼은 개수가 넘어도 NaN을 출력한다. : 이 역시 데이터프레임의 특징인데 어떤 자료에서 각각의 시리즈들이 각각의 컬럼들이 될 것이다. 그러므로 컬럼 안에 자료가 없어도 NaN 처리를 함으로 서 컬럼 생성을 할 수 있으나
  • 로우를 생성 할 시 가 컬럼들에게 없는 자료들을 모두 추가해야하는 상황이기 때문에 논리적으로 생성이 불가능한 것이다. 또한 모든 컬럼들이 동일한 스케일을 쓰는 일은 거의 없으므로 이런 식의 자료추가도 흔치 않다.
    • 즉 컬럼은 인덱스 개수 차이가 나도 생성이 된다는 말씀

DataFrame 속성

  • 속성은 소괄호를 붙이지 않음
  • index : df 객체의 행 인덱스 배열을 반환
  • columns : df 객체의 열 인덱스 배열을 반환
  • axes : df 객체의 행, 열 인덱스를 아이템으로 가지는 배열을 반환
  • values : df 객체의 데이터(값)를 아이템으로 가지는 2차원 배열을 반환
  • dtypes : df 객체의 데이터 타입을 열 기준으로 반환
  • size : df 객체의 데이터 개수(길이)를 반환
  • shape : df 객체의 구조(행, 열, 차원)를 반환
  • T : 행과 열을 전환시킴

딕셔너리 타입 데이터로 데이터프레임 생성

  • 행의 인덱스를 변경해보자. (행(row) 인덱스 : 행 개수와 동일하게 리스트로 전달해야 한다.)
    • 연도 기입!
    • 참고 : 행, 열의 인덱스 이름 지정 함수
      • sample.index.name = 'year
        sample.columns.name = 'location'
  • 열 인덱스도 변경 가능
  • 행 인덱스(row) 수정
    • 리스트 문법
        1. 행의 개수와 동일한 리스트를 전달(변경 행 포함 모두 기입해야 한다. 매우 불편)
        1. 속성값으로 사용하는 인덱스 객체는 아이템 수정 불가 (하나만 수정 불가)
    • df 메서드
      • df 메서드 : df변수.rename(data, axis)
      • axis 기본값 = 0 (로우 == 'index')
      • 열 인덱스(컬럼)에 대한 수정 : axis=1 혹은 axis='columns'
      • data : 딕셔너리타입, {'이전 인덱스명' : '바꿀 인덱스명'}
      • inplace=False(기본값) : 바뀐 결과가 적용x (원본 변화 없음)
      • inplace=True : 결과가 바로 적용
      • 행 인덱스 변경
      • 열 인덱스 변경도 마찬가지
    • 리셋 메서드
      • reset_index(drop=True)를 사용하면 row에 배정된 인덱스를 일괄 삭제한다.
        • drop 부분을 False 시 삭제하고자 했던 연도부분 옆에 리셋된 행이 들어오게 된다.
    • 행, 열 전치 함수 :
      • sample.T
      • 전치는 1회성으로 진행됨(원본 sample 변수는 그래도 3 * 5 구조를 유지하고 있다.)

인덱싱

  • 컬럼 조회

    • df[col]
    • df.col
    • df.get(col)
  • iloc, loc 메서드로 로우 조회 (시리즈 특성상 인덱스 번호와 라벨 인덱스 번호가 존재하므로 2가지 조회법이 있다.)

    • df.iloc[idx] : 기본 숫자형 인덱스
    • df.loc[label] : 새롭게 지정한 인덱스(숫자형이어도 기본 인덱스가 아니면 모두 loc 메서드로 조회)
  • 컬럼 조회법 세 가지

    • '서울' 컬럼 조회
      - 1. 기본적인 인덱싱 기호 : df[column]
      - 2. 컬럼명을 . 를 이용해서 조회, 무조건 이름이 변수명으로 사용될때만 가능
      - 3. df의 det 메서드로 조회 : df.get(column)
  • df.iloc[idx] / df.loc[label]

    • 기본적으로 리스트나 튜플이나 numpy.array 할 것 없이 모두 인덱스 넘버를 부여 받습니다.(iloc로 검색) 이 자료들이 데이터프레임화되면서 (자료의 더 효율적인 시각화를 위해) 데이터의 인덱스에 사용자 임의의 행과 열 이름을 부여함에 따라 라벨링 인덱스가 생겨나게 되었습니다.(loc로 검색)
    • 샘플
    • df.iloc[idx] : 자료에 자동부여되는 인덱스 넘버로 검색을 한다.
      • 숫자형 라벨도 상관없이 라벨링으로 검색해야 한다.
  • 자료 검색의 활용

    • 여러개의 열 조회 : 리스트로 묶어서 전달(서울, 경기)
    • 행 + 열 조회 : 서울, 경기지역의 1992년 데이터만 조회
    • 여러 개의 행 조회(1990, 1993년 한꺼번에 조회)
      • 이 중 충청 컬럼만 조회하기(데이터프레임으로 출력하기)

슬라이싱

  • 로우(행) 슬라이싱

    • 순서가 있으며 로우 단독으로 슬라이싱 가능
    • 기본 슬라이싱 문법은 기본 숫자형 인덱스를 기준으로 적용
    • 기본 숫자형 인덱스로 슬라이싱할 때는 마지막 인덱스는 포함하지 않고 라벨 인덱스로 슬라이싱할 때는 마지막 인덱스를 포함
  • 컬럼(열) 슬라이싱

    • 순서가 없기 때문에 컬럼 단독으로 슬라이싱할 수 없음
    • 라벨 기준으로 로우 기준 슬라이싱 결과에 대해 컬럼 슬라이싱 가능(기본 숫자형 인덱스는 적용 불가)
    • 마지막 인덱스를 포함
  • 로우 슬라이싱 (샘플로 기존 인덱스 문법을 사용해 보자.)

    • 자주 쓰던 역순 출력도 가능하다.
  • 컬럼 슬라이싱 : 행에 대한 슬라이싱 결과에 열 슬라이싱 적용

    • df[:,start:end:step]
    • 기본 숫자형 인덱스 기준의 슬라이싱 -> 컬럼명으로 사용
      • 컬럼 슬라이싱의 경우 모든 로우를 출력한 상태에서 조건을 좁히는 식으로 명령어를 짜야한다는 점이 로우 슬라이싱과 다른 점이다. 이 역시 자료 활용에 연관된 부분인듯 하다.
    • 컬럼과 로우 인덱스가 모두 기본 숫자형 인덱스로 이루어진 경우
      • 컬럼명이 숫자로 되어 있어 기존 문법으로 슬라이싱이 가능
      • 하지만 데이터프레임 문법으로 하게 되면 에러가 출력된다.
  • 컬럼 슬라이싱에서 사용하는 인덱스 : 기본 번호 인덱스

      1. 컬럼 슬라이싱 조건 : 로우 슬라이싱 결과에서만 가능
      1. 메서드를 사용한 로우 슬라이싱 : iloc / loc -> 1번 기준

연습문제

아래와 같은 데이터프레임을 생성하고 출력화면과 동일한 결과를 생성하세요.

  • 딕셔너리 형태의 데이터를 만들어주고 이를 데이터프레임에서 출력한다.
    • Col1, Col3을 함께 조회해주세요.
    • A, C, D 로우만 조회해주세요.
    • B, D 로우의 Col1, Col2만 조회해주세요.

컬럼, 로우 추가

  • 컬럼 추가 / 변경

    • 컬럼 인덱싱 = 스칼라 값
    • 컬럼 인덱싱 = 배열, 리스트(로우 개수와 아이템 개수 일치)
    • 컬럼 인덱싱 = 컬럼 간의 연산
    • 컬럼 인덱싱 = series
  • 로우 추가

    • 로우 인덱싱 = 스칼라 값
    • 로우 인덱싱 = 로우 간의 연산
  • 데이터 분석에서 컬럼과 로우의 의미

    • 컬럼 : 변수(특성)
    • 로우 : 개별 데이터(레코드)
    • 전체 데이터를 구성하는 변수를 추가/삭제하는 일은 빈번하게 발생하지만 특정 인덱스를 기준으로 전체 로우 데이터를 추가/삭제하는 일은 자주 발생하지 않으며 데이터 처리를 하는 과정에서 권장하지 않는 작업
  • 컬럼을 추가해봅시다.

    • 모든 로우에 대해서 동일한 값을 가지는 컬럼 => 스칼라값(단일값)
    • 컬럼 추가 2 : 서로 다른 값을 가지는 데이터로 열을 구성하는 컬럼의 숫자
      • 조건 : 전달하는 자료형(배열, 리스트)의 길이 = 행의 길이
      • 부산 컬럼 추가, 데이터는 5부터 1씩 증가하는 숫자를 가지는 배열
      • 컬럼 추가 3 : 컬럼 간의 연산 -> 파생변수
      • 수도권 : 서울 + 경기
    • 컬럼 추가 4 : Series 객체를 컬럼으로 전달
      • 조건 : 추가 대상인 df의 구조와 추가 아이템인 Series의 구조를 파약해야됨
      • 라벨 인덱스를 기준으로 Series 데이터와 df 데이터가 매핑하기 때문에 Series 에 없는 라벨 인덱스의 경우에는 NaN으로 출력함
      • 즉, 반드시 길이가 일치하지 않아도 된다.
    • 주의 사항 : 매핑 기준은 인덱스가 아닌 라벨이기 때문에 데이터 개수가 동일해도 값 전달이 이뤄지지 않는 케이스가 발생할 수 있다.
      • 1990년, 1992년 인덱스에 9와 -99라는 자료를 넣으세요.
      • 자료 입력을 명령했으나 어떤 컬럼에 들어갈지 지정하지 않았기 때문에 만약 컬럼을 하나 추가하게 되면 그 곳으로 자료가 배치된다.
      • 하지만 인덱스를 라벨 인덱스가 아닌 자동부여 인덱스로 지정하게 되는 경우 컬럼(test)을 새로 생성하더라도 자료가 배치되지 못하고 NaN으로 출력하게 된다.
  • 로우를 추가해봅시다.

    • 로우 인덱싱 = 스칼라 값
    • 로우 인덱싱 = 로우 간의 연산
    • 로우 인덱싱 = 자료형(배열, 리스트 / 컬럼 개수와 아이템 개수 일치)
    • 로우는 .loc를 이용해서 추가해준다.
      • .loc가 붙는다는 점만 빼고는 컬럼과 완전히 동일한 문법을 사용한다.
    • 배열 리스트, 딕셔너리 : 로우 추가 가능한 자료형
      • 컬럼 개수와 아이템 개수를 일치시켜 전다.
      • 0~9까지 증가하는 리스트를 전달해보세요.
        • np.arange(10) 도 가능
    • 딕셔너리로 각 컬럼명 : 값 형식으로 매칭된 자료를 연도 로우에 대입
      • 로우끼리 연산도 가능

로우, 컬럼 삭제

  • 컬럼 삭제
    • del 키워드 + 컬럼 인덱싱
    • df.drop(col, axis=1)
    • df.drop(columns=col)
  • 로우 삭제
    • df.drop(idx) : axis = 0 (기본값)
  • 컬럼을 삭제해봅시다.
    • 컬럼 삭제 1 : del 키워드 + 컬럼 인덱스
      • 특징 : 원본 객체에서 바로 데이터가 사라짐(시뮬레이션이 아니라 즉시 적용)
    • 컬럼 삭제 2 : df.drop(columns = 컬럼이름)
      • 특징 : 원본 반영 되지 않음 -> inplace=True 기입시 원본에 바로 반영
      • 경상 컬럼을 위의 설명대로 삭제해주세요.
    • 컬럼 삭제 3 : df.drop(컬럼명, axis=1)
      • 충청컬럼을 삭제해보세요.
  • 로우를 삭제해봅시다.
    • 로우 삭제
      • df.drop(로우명, axis=0(생략가능))
      • 1995년 데이터를 삭제해주세요.
    • 두 개 이상의 컬럼이나 로우 삭제 : 리스트로 묶어서 전달.
      • [제주, 강원]을 삭제해주세요.
    • 로우 역시 리스트로 묶어서 전달하면 동시에 두 개 이상도 삭제가 가능합니다.
      • 1994, 1997년 데이터를 삭제해주세요.

산술연산

  • dataframe 과 스칼라 값 산술연산

  • dataframe 과 series 간의 산술연산

  • dataframe 간의 산술연산

    • 컬럼, 로우 인덱스를 기준으로 연산 수행
    • 공통으로 존재하지 않는 경우 NaN 반환
    • fill_value 인자 값을 통해 NaN이 아닌 값으로 대체 가능
  • 연산의 종류

    • 더하기 : +, add() 메서드
    • 빼기 : -, sub() 메서드
    • 곱하기 : *, mul() 메서드
    • 나머지만 반환 : %
    • 몫만 반환 : //
  • 컬럼명을 서울, 경기, 인천으로,

    • 로우명을 a, b, c로 가지고 0부터 1씩 증가하는 정수 값을 데이터로 가지는 DataFrame1을 만들어보자.
    • 컬럼명을 서울, 경기, 인천, 세종, 강원으로 로우명을 a, b, c, d로 가지고 0부터 1씩 증가하는 정수값을 데이터로 가지는 DataFrame2를 만들어보자.
  • 컬럼 간의 연산

    • 같은 컬럼이면서 같은 로우인 경우 연산 가능 : 범위가 벗어나는 경우 NaN 처리
      • 데이터프레임간 더하기 연산
      • 결과 해석 : 공통 컬럼, 로우인 데이터만 정상 섣하기, 아닌부분은 NaN
      • fill_value : add 메서드의 파라미터
      • 빼기, 곱하기, 나누기 역시 같은 방식으로 이루어진다.
        • NaN이 그래도 나오는 이유는 0을 1로 나눠봐야 0이 되기 때문이다.

DataFrame과 Series 간의 연산

  • 기본적인 동작은 Series 객체의 인덱스를 DataFrame 객체의 컬럼 인덱스와 매핑하여 브로드캐스팅과 유사하게 연산 수행

  • 두 객체 간의 공통된 인덱스가 아닌 대상은 NaN 값으로 대입

  • 메서드를 사용하여 연산을 수행할 때는 axis 파라미터를 통해 연산을 적용할 축 지정(0:행, 1:열)

  • 연산의 종류

    • 더하기 : +, add() 메서드
    • 빼기 : -, sub() 메서드
    • 곱하기 : *, mul() 메서드
  • 컬럼명 : a, b, c, d
    로우명 : 2010, 2011, 2012
    데이터 : 0부터 1씩 증가하는 정수인 데이터프레임을 생성해봅시다.

    • 첫 번째 행을 추출 및 s1 : 라벨 인덱스가 적용된 시리즈 만들기.
    • Series(라벨 인덱스 a, b, c, d)와 df의 결합기준 : 이름이 일치할때 더하기 (a, b, c, d에 모두 더해짐)
      • 인덱스가 다를 때
      • 데이터프레임 / 컬럼명 : a, b, c, d, e / 데이터 : 20개의 0
      • 기본 인덱스를 가진 시리즈 / 데이터 0, 1, 2, 3, 4
    • 시리즈의 라벨 인덱스는 데이터프레임의 컬럼과 같은 것으로 인식되는데 서로 인덱스가 다르면
      • 열 단위 산술 연산
      • 기본 동작 : Series의 로우 인덱스를 df의 컬럼에서 매핑
      • 결과해석
    • 컬럼과 시리즈의 라벨 인덱스가 일치하지 않는다면 로우와 시리즈를 일치시킬 수 있다.
      • axis = 0
      • 결과해석 : idx 4번의 결과만 NaN(s2의 4번 인덱스)
    • 만약 df의 컬럼에 없는 인덱스를 가진 시리즈와 연산한다면?
      • 공통되지 않은 인덱스값과 컬럼값 -> NaN으로 출력
      • 시리즈와의 연산에 있어서 fill_value는 사용할 수 없다.
profile
가즈아~

0개의 댓글