ㅅㅇ

Pandas _ 06 DataFrame_재구조화 본문

AI_STUDY/Pandas

Pandas _ 06 DataFrame_재구조화

SO__OS 2022. 6. 15. 00:12
플레이데이터 빅데이터캠프 공부 내용 _ 

Pandas_06_DataFrame_재구조화

전처리  (TIDY DATE(data set 정제), 결측치 제거 ... 이 작업이 머신러닝의 70~80%)  --- >> 모델링

1.  정돈된 데이터 (Tidy Data) 개요

대부분 실행환경에서의 많은 데이터 셋은 세부적 분석을 작업을 하기 전에 

상당한 양의 데이터 재구성을 할 필요가 있다. 

경우에 따라서는 전체 프로젝트 자체가 

오로지 다른 사람들이 가공하기 쉬운 형태로 데이터를 재구성하는 일일 때도 있다.

 

데이터 재구성의 목적은

정돈된 데이터 tidy data를 만드는 것이다.     

 

tidy data란 

용어는 해들리 위컴이 분석이 용이한 형태로 구성되 있는 데이터셋을 설명하기 위해 만든 용어이다.

 

1.1 정돈된 데이터란?

각 변수(데이터의 속성)는 을 형성한다.
각 관측값(하나의 데이터)은 을 형성한다.
- 각 관측 단위별(데이터 Entity)로 별도의 테이블(표)을 구성한다. => '단일 관측'

 

1.2 변수, 관측값, 관측단위

 

- 변수: Feature, 컬럼


- 변수 이름: 성별, 인종, 연봉, 직위 같은 레이블


- 변수 값  
    - 관측 때마다 달라지는 값
    - 성: 남성/여성
    - 인종: 황인/흑인/백인
    - 연봉: 삼천만원, 4천만원...


단일 관측
    - 하나의 Entity, 하나의 데이터를 말한다. => 이것을 단일 관측 단위라고 한다.
        - DataFrame(Pandas), Table(데이터베이스), 표(엑셀)로 표현된다.
    - 단일 관측 대상은 여러개의 속성들로 구성되며, 그 속성을 변수,Feature, 컬럼이라고 한다.
        - 단일 관측은 하나의 데이터 대한 모든 변숫값의 모음
        - 관측(관찰) 대상의 단위 => 하나의 데이터 => 변수들로 구성됨
    - ex) 종업원, 손님, 제품 ..
        - 종업원정보(근무시간같은)와 고객정보(구매 액수)를 같은 테이블에 병합하는 것은 단일 관측이라 할수 없다.

                 -> 정돈된 데이터의 원칙에 위배된다.

 

1.3 정돈되지 않은 데이터의 가장 흔한 형태

1) 열 이름이 변수 이름이 아니라 값인 경우
2) 열 이름에 복수 개의 변수가 저장된 경우
3) 변수가 행과 열에 모두 저장된 경우
4) 같은 테이블에 복수 형식의 관측단위가 저장된 경우
    - 하나의 테이블에 여러 데이터(관측단위)가 병합된 것
5)  단일 관측 단위가 복수 테이블에 저장된 경우
    - 하나의 데이터의 변수들이 여러 테이블에 나눠 저장된 경우


1.4 데이터를 정돈한다의 의미

단순히 데이터셋의 값을 바꾸거나 결측치를 채운다는 것만을 말하지 않는다. 

데이터를 정돈하는 것은 데이터의 형태나 구조를 정돈 원칙에 맞게 변형시키는 것이다. 

   - > 데이터가 올바른 형태로 주어진다면 분석이 쉬워진다.

 

2. Pandas의 정돈을 위한 메소드

https://pandas.pydata.org/pandas-docs/stable/user_guide/reshaping.html

 

Reshaping and pivot tables — pandas 1.4.2 documentation

But suppose we wish to do time series operations with the variables. A better representation would be where the columns are the unique variables and an index of dates identifies individual observations. To reshape the data into this form, we use the DataFr

pandas.pydata.org

- stack()
- melt()
- unstack()
- pivot()
- pivot_table()
- 텍스트 분해를 위한 str accessor
- 정돈된 데이터를 다듬는 메소드
    - rename()
    - rename_axis()
    - reset_index()
    - set_index() 

 

 

2.1 stack()  : 컬럼명을 index(행명)으로 전환
    - 기존 index가 있으면 하위 레벨로 들어간다. (기존 것이 상위 레벨)
- 컬럼명을 컬럼의 값으로 전치시킬때도 사용할 수 있다.
- 매개변수
    - dropna=False : stacking 시 생성되는 NA(결측치)는 제거되지 않게 한다. (default: True => 제거)

 

 

EX)

- 현 테이블은 정돈되지 않은 테이블이다.

Apple, Orange, Banana는 컬럼이 이나라 값으로 쓰여야 한다.  -- > 값이 의미하는 바를 알 수 가 없다.

 

- 행은 간혹 이렇게 쓰일 수도 있지만, 열은 이렇게 쓰이지 않는다.

컬럼명은 각 열 데이터의 속성을 나타내는 의미를 지니고 있어야 한다.
그렇기에 의미적으로는 맞아도 정돈되지 않는 데이터프레임인것 이다.

 

** 원본을 저장하지 않기에 변수에 넣어준다.

 

1)  컬럼명을 인덱스로 빼기  :  Stack()

   - > 기존 인덱스가 있기에 하위레벨로 들어가 multi index 된다.

s1 = state_fruit.stack()

 

2) Series를 DataFrame으로 변화  :  series.to_frame( name  =  ' 컬럼명 ' )

  - > 구조는 그대로

  - > 컬럼명 지정해줘야 한다. - > name = '컬럼명'

s1 = s1.to_frame(name='price') # 컬럼명의 경우 대소문자 통일하는 게좋음.

 

3) DataFrame의 index를 값으로 변환  :  .resex_index

   -  Texas, Ariezona, Florida / Apple, Orange, Banana 가 값으로 들어가야 한다.

       - > 현재 인덱스명이 없기에 값으로 변환될 때 컬럼명이 지정되지 않는다.

       - > 값의 속성을 의미하는 컬럼명을 지정한다.  :  .rename( colums = { ' 현재 컬럼명 ' : ' 바꿀 컬럼명 ' } )

state_fruit_tidy = s1.reset_index() # 모든 인덱스가 값으로 나온다.
state_fruit_tidy.rename(columns = {'level_0':'state', 'level_1':'fruit'}, inplace=True)

 

 

2.2 unstack()  : index 값을 컬럼(열 명)으로 변환한다.

- stack() 반대로 
- 매개변수 

    - level : multi-index 일 경우 컬럼으로 만들 레벨을 지정한다.

                기본값은 level = -1 로 가장 안쪽의 index를 이동시킨다.

 

- 인덱스 멀티일 때, 제일 안쪽부터 fruit  -1 ,   state  -2 ...     = >   안쪽(-1)  index가 컬럼으로 나온다.

s.unstack() # s.unstack(level = -1) 기본값

 

 

2.3 melt() : 컬럼명을 값으로 변환

- stack()과 같이 컬럼 명을 단일 컬럼의 값으로 변환한다.
변환할 컬럼들을 지정할 수 있어 stack()보다 더 유연하다.
    - stack은 실행하면 모든 컬럼이 다 변환지만,  melt는 원하는 일부만 변환할 수 있다.

 

< 매개변수 >


1 ) id_vars

      : 값으로 변환하지 않고 그대로 유지하고자 하는 컬럼명(열이름)들의 리스트
    - 식별변수 라고도 한다.
    - 지정한 변수(컬럼)은 같은 열에 남게 되지만, value_vars에 전달된 각 열에 대해 반복적으로 나타난다.


2 )  value_vars

     : 단일 컬럼의 값으로 변경하고자 하는 컬럼명 리스트
    - value_vars에 지정한 컬럼이 value가 되고 그 컬럼의 값들은 다른 컬럼으로 생성된다.


    - id_vars와 value_vars에 지정 안된 컬럼은 제거된다.
        - 제거 되지 않고 단독 컬럼으로 유지되길 바라는 컬럼은 id_vars로 지정한다.


3 )  var_name

     : value_vars로 단일열이 된 열의 이름 지정(지정 안하면 컬럼명은 variable)


4 )  value_name

      : value_vars에 지정된 열들의 값들이 변환된 컬럼의 이름 지정(지정안하면 컬럼명은 value )


 - melt 한 경우 index명은 무시된다. => RangeIndex로 대체된다.
      - index를 유지하려면 reset_index를 이용해 value로 뺀 뒤 해야 한다.


 - stack은 열이름을 index명으로 정돈(변경) 한다.

 

 

EX.)  아래의 테이블에서 column 명 : Apple, Orange, Banana은  컬럼의 값으로,   

                                        state 컬럼은 그대로 유지하고 싶다.

 

state_fruit_melt = sf.melt(id_vars=['state'], # 컬럼으로 유지될 컬럼명
                           value_vars=['Apple', 'Orange', 'Banana'],  # 컴럼의 값으로 만들 컬럼명
                           var_name='fruits',   # value_var에 지정한 컬럼명을 값으로 가지는 컬럼의 이름
                           value_name = 'price' # value_vars 에 지정한 컬럼들의 값들을 가지는 컬럼의 이름
                           )

이름 설정 안 하면.


2.4  pivot  :  index, column, value가 될 컬럼들을 지정해 재구조화

 

- 데이터프레임 재구조화가 목적


- 데이터 프레임에서 두개 이상의 범주형 변수를 그룹으로 묶어 특정 값을 보려고 할 때 사용할 수 있다.
    - pivot_table은 그룹으로 묶은 뒤 특정 변수의 통계량을 본다면,

      pivot은 그 값을 그대로 본다.


- melt()된 것을 원상복구 시킬때도 사용할 수 있다. 값을 인덱스와 컬럼으로 한 구문안에 할 수 있다.

< pivot 매개변수 >
- index: 문자열. 행이름으로 사용할 컬럼    - >   열이 index로 이동하는 형태가 된다.
- columns: 문자열. 컬럼명으로 사용할 컬럼
- values : Value에 올 컬럼명

 

df = state_fruit_melt.pivot(index='state', # state 컬럼의 고유값들을 index명으로 만든다.
                            columns ='fruits', # fruits 컬럼의 고유값들을 columns 명으로 만든다.
                            values='price') # dataframe의 값으로 price 컬럼의 값들을 사용. 
                                            # (state_fruits의 같은 행의 price 값을 cross하는 cell의 값으로 넣는다.)

'AI_STUDY > Pandas' 카테고리의 다른 글

pandas _ nlargest, nsmallest  (0) 2022.06.22
Pandas _ 04 groupby 관련메소드 및 일괄처리 메소드  (0) 2022.06.10
데이터셋 read시 루틴  (0) 2022.06.10
Pandas _ 03-2 집계  (0) 2022.06.09
Pandas _ 03-1 정렬  (0) 2022.06.09