ABOUT ME

Today
Yesterday
Total
  • [python] 파이썬을 이용한 빅 데이터 실습 7 - DataFrame , 계층색인
    Languages/python 2021. 11. 1. 13:43
    반응형

     

     

     

     

     

     

     

     

     

     

    실행결과는 복사 붙여넣기이므로 이상해도 양해부탁드립니다.

     

     

    DataFrame

     

    고차원 데이터 다루기

     

     

     

     

     

    계층 색인(다중 색인)

     

    여러 개의 인덱스가 계층을 이루고 있기 때문에

    계층 색인 혹은 다중 색인이라고 한다.

     

    계층색인을 데이터프레임에 적용하여 3차원 이상의 고차원 데이터를 처리 가능

     

     

     

    import pandas as pd
    from pandas import Series, DataFrame
    import numpy as np

     

     

     

     

    샘플 데이터 생성

     

     

    로우 인덱스

     

    학생들에 대한 정보를 담고 있는 단순 1차원 인덱스

     

    컬럼 인덱스

     

    다중 색인(계층 색인)

     

    # 샘플 데이터 생성
    np.random.seed(0)
    df = pd.DataFrame(np.random.randint(50, 100, (5, 6)), 
                      columns=[[2019, 2019, 2019, 2020, 2020, 2020], ['영어','수학', '과학','영어','수학', '과학']], 
                      index = ['Kim','Park','Lee','Jung','Moon'])
    df.index.set_names('학생명', inplace = True)
    df.columns.set_names(['년도','과목'], inplace = True)
    df.loc['Moon', (2019, '과학')] = np.nan
    
    
    df

     

     

     

     

    실행결과

     

     

     

     

     

     

    1) 인덱싱

     

    2020년 데이터만 선택

     

    df[2020]

     

     

    2020년 정보만 출력 ->

     

    과목	영어	수학	과학
    학생명			
    Kim	53	53	89
    Park	86	73	56
    Lee	51	88	89
    Jung	67	87	75
    Moon	70	66	55

     

    2020년 영어 성적만 출력

     

    * 색인 기호에 컬럼 인덱스에 대한 정보 기입

    - 해당 년도(2020)와 해당 과목(영어) 지정

     

     

    df[2020]['영어']

     

    *계층 색인의 경우, 튜플의 형태로 인덱스 지정

    - 해당년도와과목 (2020,'영어') 지정

     

    df[(2020,'영어')]

     

    *색인 기호에 리스트로 담아 인덱스 지정

    -주의) 두개 이상의 색인을 할 때 리스트로 담아서 색인을 하게 되면 

             두개의 컬럼을 각각 찾으라고 하는 의미

     

    df[2020,'영어']

     

     

     

    실행결과

     

    학생명
    Kim     53
    Park    86
    Lee     51
    Jung    67
    Moon    70
    Name: 영어, dtype: int32

     

     

    kim의 성적만 선택

     

    로우 인덱스 - 데이터 프레임의 색인과 동일

    ->loc, iloc에 색인 기호를 넣고, 해당 정보 기입

     

     

    df.loc['Kim']

     

     

    실행결과

     

    이때 실행결과에는 시리즈 형태로 출력된다.

    -> 제 실행결과로는 확인이 불가하오니 꼭 쥬피터로 실습바랍니당 ㅜㅜ

     

    데이터 프레임

    인덱스 - 볼드, 배경색 - 구분되어 표현

    시리즈

    하얀 형태에 텍스트로만 출력된다

     

     

    년도    과목
    2019  영어    94.0
          수학    97.0
          과학    50.0
    2020  영어    53.0
          수학    53.0
          과학    89.0
    Name: Kim, dtype: float64

     

     

     

    2) 슬라이싱

     

    Kim, Park, Lee의 성적만 선택

     

    loc에 색인기호를 넣고 'Kim' : 'Lee'로 표현

    loc, iloc는 생략 가능

     

    #df.loc['Kim':'Lee']
    #df['Kim':'Lee']
    #df.iloc[:3]
    df[:3]

     

     

    실행결과

     

    위 소스 전부 동일한 결과

     

    년도	2019	2020
    과목	영어	수학	과학	영어	수학	과학
    학생명						
    Kim	94	97	50.0	53	53	89
    Park	59	69	71.0	86	73	56
    Lee	74	74	62.0	51	88	89

     

     

     

    [실습] - 실습은 실행결과를 생략합니당 직접 해보세용~~~~

     

     

    Park과 Jung의 2020 영어 성적 선택

     

    리스트 : Park이랑 Jung을 각각 색인

    튜플 : 계층 색인을 색인

     

    df.loc[['Park','Jung'],(2020, '영어')]

     

    2019,2020년 영어 성적 선택하기

     

    각각의 색인은 계층 색인이므로 튜플의 형태로 하고,

     년도 구분은 리스트 형태로 지정

    xs를 이용하여 성적확인도 가능

    이때 최상위 레벨은 0이다

    df[[(2019,'영어'),(2020,'영어')]]
    
    xs(색인하고자 하는 인덱스 이름,axis,level)
    df.xs('영어',axis = 1,level = 1)

     

     

     

     

     

     

     

    색인(index) 객체가 제공해 주는 기능 및 함수들

     

     

    인덱스 이름 부여하기(set_names())

     

    set_names함수는 데이터 프레임을 생성을 하면서 이름을 부여한 것

    set_names() 함수는 인덱스의 함수이다

     

     

    로우 인덱스의 이름을 '학생명' 이라고 지정하기

    -inplace=True 는?

    위 지정명을 넣지 않으면 원본 데이터에 저장 되지 않는다.

    df.index.set_names('학생명',inplace=True)
    df

     

     

    년도	2019	2020
    과목	영어	수학	과학	영어	수학	과학
    학생명						
    Kim	94	97	50.0	53	53	89
    Park	59	69	71.0	86	73	56
    Lee	74	74	62.0	51	88	89
    Jung	73	96	74.0	67	87	75
    Moon	63	58	NaN	70	66	55

     

     

     

     

     

     

     

     

     

     

    인덱스 재구성 하기

     

     

     

     

     

    reset_index()

     

    로우 인덱스를 하나의 컬럼으로 변경

     

     

    df.reset_index()

     

     

    실행결과

     

      년도	학생명	2019	                2020
    과목		영어	수학	과학	영어	수학	과학
    0	Kim	94	97	50.0	53	53	89
    1	Park	59	69	71.0	86	73	56
    2	Lee	74	74	62.0	51	88	89
    3	Jung	73	96	74.0	67	87	75
    4	Moon	63	58	NaN	70	66	55

     

     

     

     

    set_index()

     

    인자로 받은 컬럼의 값들을 로우 인덱스로 변경

     

    df.reset_index().set_index('학생명')

     

     

    실행결과

     

     

    년도	2019	              2020
    과목	영어	수학	과학	영어	수학	과학
    학생명						
    Kim	94	97	50.0	53	53	89
    Park	59	69	71.0	86	73	56
    Lee	74	74	62.0	51	88	89
    Jung	73	96	74.0	67	87	75
    Moon	63	58	NaN	70	66	55

     

     

    swaplevel(index1, index2, axis)

     

    index1과 index2의 위치를 변경함.

    index1과 index2가 로우 인덱스인 경우, axis = 0, 컬럼인덱스면 1 (기본값은 0)

     

     

     

    년도와 과목의 위치를 변경

     

    df.swaplevel('년도','과목',axis=1).sort_index(axis=1) // 아래와 동일
    
    df.swaplevel(0,1,axis=1)

     

     

     

    과목	영어	수학	과학	영어	수학	과학
    년도	2019	2019	2019	2020	2020	2020
    학생명						
    Kim	94	97	50.0	53	53	89
    Park	59	69	71.0	86	73	56
    Lee	74	74	62.0	51	88	89
    Jung	73	96	74.0	67	87	75
    Moon	63	58	NaN	70	66	55

     

     

     

     

     

    컬럼 인덱스 과목을 로우 인덱스로 변경

     

     

    df2 = df.stack(1)
    
    df2

     

     

     

    실행결과

     

    년도	      2019    2020
    학생명	과목		
    Kim	과학	50.0	89
    	수학 	97.0	53
    	영어	94.0	53
    Park	과학	71.0	56
    	수학	69.0	73
    	영어	59.0	86
    Lee	과학	62.0	89
    	수학	74.0	88
    	영어	74.0	51
    Jung	과학	74.0	75
    	수학	96.0	87
    	영어	73.0	67
    Moon	과학	NaN	55
    	수학	58.0	66
    	영어	63.0	70

     

     

     

     

    반응형

    댓글

Designed by Tistory.