본문 바로가기
공부 목록/IT & 프로그래밍

Pandas 데이터프레임 기본 인덱싱 이론과 방법

by 독학박사 2023. 1. 5.

목차


    데이터 분석을 위해 파이썬을 사용하는 데 있어 판다스(pandas)는 핵심이라 할 수 있습니다.. 데이터를 불러와 전처리를 수행하고 데이터 관계 확인 및 데이터 가시화까지 모두 지원되기 때문입니다. 판다스 홈페이지에서 해당 매뉴얼을 pdf로 제공해주고 있으며 현재 버전은 1.4.4로 약 3700페이지가량 됩니다. 오늘은 이 중에서 인덱싱에 관련된 내용을 포스팅하려고 합니다. 판다스 매뉴얼은 아래 링크에서 다운받을 수 있습니다.

     

     

    https://pandas.pydata.org/pandas-docs/version/1.4/pandas.pdf

     

     

    1. 데이터프레임 셋 구성

     판다스의 데이터프레임에서 가장 기본적으로 사용하는 데이터 추출방법은 [], loc, iloc 총 3개가 있습니다.. 우선 데이터프레임 구조의 데이터 셋을 구성하고 각 인덱싱 방법에 대해 비교해 보도록 하겠습니다.

     

    import pandas as pd
    import numpy as np
    
    dates = pd.date_range('1/1/2023', periods=8)
    df = pd.DataFrame(np.random.randn(8, 4),
                      index=dates, columns=['A', 'B', 'C', 'D'])

     

    데이터셋
    데이터셋 df

     

     

    DataFrame과 random을 사용하기 위해 pandas와 numpy를 각각 임포트 하였습니다. dates는 데이터프레임의 index로 쓰기 위해 사용하였고 date_range는 DatetimeIndex 타입을 만들어 줍니다. '1/1/2023'은 시작 날짜이며 periods는 일 단위로 8일을 의미합니다. 데이터프레임 df는 dates의 개수와 같은 8개의 행과 columns 개수와 같은 4개의 열을 갖는 데이터 셋입니다.

     

     

    2. Label 인덱싱([] 인덱싱)

     [] 열 인덱싱 : 위치 인덱싱에서 보편적으로 사용하는 방식은 '[]'를 사용하는 것입니다. df['A']는 'A'열을 series 타입으로 반환합니다. [] 인덱싱은 열과 열의 값을 바꾸는데 유용하게 사용됩니다. df[['A', 'B']] = df[['B, 'A']] 은 A열과 B열의 값을 바꿔줍니다. df['A'] = df['B']는 B열의 값을 A열로 복사해 줍니다. [] 인덱싱의 주의점으로 하나의 열을 호출할 때는 ['A']로 하면 되지만 2개 이상의 열을 호출할 때는 [['A', 'B', 'C']]와 같이 리스트 형태로 넣어줘야 합니다.

     

     [] 행 인덱스 : [] 안에 행의 이름대신 숫자를 사용하게 되면 행을 반환합니다. 다만 한 개의 숫자를 사용하면 안 되고 '1:3' 같이 범위를 지정해줘야 하며 1은 포함되고 3은 미포함으로 1~2행을 추출합니다. df[1:4]의 결과는 아래와 같습니다.

     

    추출결과
    추출결과

     

     [] 인덱싱을 이용하여 하나의 값을 추출할 때 행과 열 인덱싱을 조합하면 됩니다. 다만 순서가 바뀌면 결과값의 타입이 달라지니 조심해서 사용해야 합니다. 예로 1월 4일의 'A'열 값을 얻고 싶다면 ①데이터프레임에서 'A'열을 먼저 추출하고 ②1월 4일의 값을 받으면 됩니다. 이렇게 되면 1.3235 숫자를 반환합니다. 순서를 바꿔서 사용하고 싶다면 문법을 조금 변경해야 합니다. 행을 먼저 호출하기 위해서는 3:4와 같이 범위지정을 해야 하기 때문입니다. df[3:4]['A'] 문구를 사용한다면 시리즈 타입으로 반환되기 때문에 값만 추출하는 values 함수를 써야 합니다. 이때는 array 타입으로 만들어지기 때문에 값만 뽑으려면 [0]까지 같이 사용합니다. 즉 df['A'][dates[3]]의 구문은 df[3:4]['A'].values[0]과 같은 구문이 됩니다. 좀 복잡하긴 하지만 결과물에 대한 타입을 잘 고민해야 복잡한 데이터 분석에서 에러 발생을 사전에 막을 수 있습니다. 좀 더 편한 방법으로 행을 먼저 사용하려면 df.loc[dates[3]]['A']와 같이 .loc 를 사용하면 됩니다.

     

    추출순서
    추출순서

     

     [] 인덱싱에서 마지막으로 설명드릴 부분 ':'과 '::'를 사용하는 방식입니다. [:4]은 처음부터 3번째 행까지 [3:]는 3번째 행부터 마지막까지 추출합니다. [::]의 사용은 조금 다릅니다. df[::2]는 처음 행부터 2씩 건너뛰게 추출하는 방식입니다. 숫자의 크기만큼 건너뛰게 됩니다. 해당 기능의 재미있는 것은 df[::-1] 구문을 사용하게 되면 행이 역순으로 배치됩니다. 물론 숫자의 크기만큼 건너뛰는 기능은 그대로입니다.

     

    역추출결과
    역추출 결과

     

    3. Index를 이용한 데이터 추출(.loc 인덱싱)

     loc 인덱싱은 꼭 정확한 인덱스 명을 사용해야 합니다. 데이터프레임의 인덱스가 숫자로 되어 있다면 df.loc[1:4]와 같은 사용이 가능하지만 본 포스팅에서 만든 데이터셋은 인덱스가 날짜로 되어 있기 때문에 정확한 날짜를 기입해야 합니다. loc을 이용한 인덱싱  구문 df.loc['20230101':'20230105']와 같이 사용합니다.

     

     loc은 인덱스와 칼럽명을 정확히 알 때 데이터 추출에 용이하게 사용할 수 있습니다. 데이터의 행과 열의 이름이 길 경우 구분에 일일이 타이핑하기 어려울 수 있고, for문을 사용해야 하는 경우에는 숫자를 이용한 호출이 필요합니다. 이럴 경우에는 index와 column을 하나의 변수에 입력해 놓고 사용하면 됩니다. 위에서 만들어 놓은 dataframe의 index는 dates라는 변수에 넣어 놨기 때문에 df.loc[dates[0]: dates[5]]와 같은 사용이 가능합니다.

     

     

    4. 위치를 이용한 데이터 추출(.iloc 인덱싱)

     위치를 이용한다는 것은 데이터프레임의 좌표값을 입력시켜 준다로 생각하시면 이해가 쉽습니다. 행을 x축 열을 y축으로 가정하면 df.iloc[1:3, 2:4]는 행 1~2 범위와 열 2~3 범위의 데이터를 추출한다는 겁니다. iloc는 중간중간의 값만 추출할 수 있으며 이때는 ':' 대신 리스트를 사용하면 됩니다. df.iloc[[1, 3,], :]는 1, 3번째 행과 모든 열(:)을 추출합니다. 리스트 방식의 구문은 loc에서도 사용가능합니다.

     

    마지막으로 편리하게 하나의 열을 추출하는 방법으로 데이터프레임의 메서드를 사용하는 겁니다. df.A, df.C와 같이 데이터프레임에 칼럼명을 바로 붙이면 해당 칼럼을 추출할 수 있습니다.

     

     

    5. 마치며

     금일 포스팅의 내용은 데이터프레임 인덱싱에 대한 이해를 돕기 위해 작성하였습니다. 다른 정보의 글들보다 예시가 적은 이유는 구문 사용에 대한 이해를 확실히 하기 위해서입니다. 구문과 출력물이 많다면 이해보다는 사용법만 보기 때문에 금방 잊어버리기 쉽습니다. 오늘의 내용은 데이터프레임 인덱싱의 기초입니다. 실제 데이터 분석에서는 이와 같은 인덱싱보다 boolean 인덱싱에 대해 알아보겠습니다. boolean 인덱싱은 데이터의 조건을 넣는 것으로 if문 사용과 매우 유사하며 실제 데이터 분석에서 많이 사용하게 됩니다.