본문 바로가기
Python/Python DataAnalysis

[Python Data Analysis] 8. DataFrame 데이터 슬라이싱

by Rosmary 2021. 11. 17.
728x90
반응형

 

 

 

 

지난 포스팅에서는 DataFrame에 작성된 데이터에 대한 간략 분석 정보 및 기본 통계 내용에 대해 알아보았다. 이번 포스팅에서는 방대한 DataFrame에서 분석자가 실제로 필요한 데이터만 추출하는 슬라이싱에 대해 알아보려 한다.

 

슬라이싱은 거창한 것이 아니다. Python에서 List나 Tuple 등을 많이 사용해봤다면 알 수 있는 [:] 문법이 주를 이루기 때문에 Array형태의 변수 타입을 많이 다뤄보셨던 분들이라면 큰 어려움 없이 익숙해 질 수 있을 것이다.

 

이번 포스팅에서는 필자가 앞서 포스팅 한 내용 중 loc, iloc, df[]와  관련된 내용을 조금 더 상세히 다루려 한다. 오늘은 매서드 자체 기능에 대해 살펴보는 것이 아니라, DataFrame의 슬라이싱 코딩의 포맷을 알아보기 위함이라 매서드에 대해 간략하게 설명하는 부분은 제외할 것이다.

 

대신, 아래의 loc과 관련된 내용만 조금 보도록 하자.

 

- pandas.DataFrame.loc[행 정보, 열 정보]

   * pandas.DataFrame.loc["Index값1"]                               : Index값1에 대한 데이터 출력

   * pandas.DataFrame.loc["Index값1", "Index값2", "Index값3"] : Index값1, Index값2, Index값3에 대한 데이터 출력

   * pandas.DataFrame.loc["Index값1":"Index값5"]                 : Index값1에서 Index값5까지의 행에 대한 데이터 출력

   * pandas.DataFrame.loc["Index값1", "Column명"]              : Index값1 데이터 중 Column명 값만 출력

   * pandas.DataFrame.loc["index값1", ["Column명1", "Column명2", "Column명3"]]:

                                                                                  Index값 1에 대해 Column명1, 2, 3출력

   * pandas.DataFrame.loc["index값1", "Column명1":"Column명3"]: Index값 1에 대해 Column명1부터 3까지출력

 

 

위의 내용만 보고도 슬라이싱에 대한 감이 잡히시는 분들이라면, DataFrame에 조금이나마 익숙해진 상태라 보면 된다(조용히 뒤로 가기 버튼을 눌러주시면 된다). 그렇지 않다면 아래의 내용을 확인하도록 하자.

 

 

1. 데이터 슬라이싱과 관련된 DataFrame 변수

 

DataFrame에서 특정 정보만 출력, 즉 슬라이싱 할 수 있는 방법은 아래와 같이 크게 3가지다.

 

- df[]

- df.loc[]

- df.iloc[]

 

(1) df[]

 

이 중 df[]는 대괄호 안에 Column명 또는 index 번호(리스트 index 번호다)만 입력될 수 있으며, 나머지 두 변수는 대괄호 안에 Index 정보 또는 Index + Column 정보가 들어갈 수 있다.

 

위의 예시에서도 볼 수 있듯이, df[] 는 index 슬라이싱 시, Index 값을 참조하지 않고, Index 값의 위치정보를 참조한다. 따라서 df[1:10]으로 코드를 입력하면, df 중 첫 데이터부터 9번째 데이터까지 나타나게 된다. 반면에 column의 경우 조금 다른데, index처럼 값의 위치정보를 참조하는 것이 아니라 단순히 column 명만 참조한다.

 

 

복수의 Column을 사용하는 경우 대괄호 내의 입력 포맷이 조금 변화된다. 복수 Column을 지정할 경우, 이들 Column명을 list 형태로 묶어 대괄호 안에 넣어주어야만 인식이 된다. 그렇지 않은 경우, 에러가 발생한다.

 

이는 어떻게 생각하면 당연한 이유인데, 대괄호 안의 내용을 Column 명으로 인식하는 df[]의 특성 상, "First Name", "Last Name" 자체를 하나의 Column 명으로 인식했기 때문이다.

 

마지막으로 df[]에서 column명으로 슬라이싱 할 경우, index와 달리 범위지정(:)이 불가하다(너무 당연하게도 Column명으로는 위치 파악이 불가하기 때문이다). 따라서 아래와 같은 코드 역시 에러를 발생시킨다.

 

위의 예시로 보았듯이, df[]의 경우 Column 또는 Index만 지정할 수 있기 때문에, 분석에 필요한 데이터를 족집게처럼 뽑아내기에 어려운 점이 있다. 이 때문에 나온 것이 loc과 iloc이다.

 

 

(2) df.loc[]

 

loc[]은 location[]의 줄임말로, 말 그대로 DataFrame 내 특정 위치에 존재하는 정보를 찾기 위한 변수라 보면 된다. 앞서서 보인 포맷처럼, index만 넣을수도 있고, Index와 Column 정보를 같이 넣을 수도 있다. 필자는 먼저 Emp ID 408351인 직원의 성(姓)을 알아보려 한다.

 

 

이번에는 동일한 직원의 성명(성과 이름)에 대해 알아보자. 이들 정보는 FirstName과 Last Name에 지정되어 있다. 따라서, 아래와 같이 코드를 작성하면 ID 408351 직원의 이름을 확인할 수 있다.

 

복수의 Column, Index 지정 시, List 형태로 입력해야 함을 주의하자

 

df[]와 구분되는 df.loc[]의 특징은, column 명으로도 범위를 지정하여 데이터를 출력할 수 있다는 것이다. 가령, 현재 보고 있는 DataFrame의 경우, 서양 사람들의 이름이 First Name, Middle Name, Last Name 순으로 작성되어 있는데, 이들 정보를 Column명 "First Name"과 "Last Name"만으로도 호출이 가능하다는 이야기다.

 

 

반대로, Column에서 사용한 문법을 Index에서도 동일하게 사용 가능하다. 만약 677509직원과 408351직원, 그리고 두 직원 사이에 위치한 직원들의 이름 정보를 출력하려면 다음과 같이 진행하면 된다.

 

 

전체 직원에 대해 특정 Column 정보만 뽑을 때는 어떻게 해야 할까? df[]를 사용할 수도 있지만, df.loc[:, ["Column명1", "Column명2"...]] 로 지정하는 방법도 있다. df.loc은 Column명 입력 시, 기본적으로 index에 대한 정보가 포함되어야하므로, 전체를 의미하는 콜론(:)을 입력하여 콤마(,)로 구분하면 문제없이 전체 행에 대해 특정 정보만 추출하는 것이 가능하다.

 

 

Index 이름 또는 Column명으로 범위를 지정하여 데이터를 출력한 결과를 살펴보면 알겠지만, 일반 List 등의 Array 타입과 다르게, 마지막 정보도 화면에 출력되는 것이 보인다. 즉, 일반 List였다면 [677509:408351]에서 408351에 대한 정보는 출력되지 않았을 것이나, loc[]에서는 예외적으로 출력된다는 것이다. 이 특성은 바로 뒤에서 살펴볼 iloc[]에서는 나타나지 않는 특성이기도 하다.

 

 

(3) df.iloc[]

 

이번에는 loc과 매우 유사하게 생긴 iloc이라는 녀석에 대해 알아보려 한다. iloc에서 loc은 앞서 보았던 것과 동일하게 location을 의미한다. i는 integer, 즉 정수를 의미하는데, 이 이름의 의미에서 알 수 있듯이 DataFrame의 위치를 번호로 지정하는 기능을 가진다고 보면 된다.

 

필자는 첫 번째 직원의 정보 중, First Name 정보만 먼저 출력해보려 한다. 이를 위해 iloc을 다음과 같이 사용했다.

iloc 사용 전, First Name Column의 위치를 LIst.index를 사용하여 확인한 뒤, 코드를 작성했다.

 

다음으로, First Name과 Last Name만 출력해보자. 마찬가지로 Column 위치 확인을 위해 코드 몇 개를 추가했다.

 

 

First Name과 Last Name의 위치가 두 번 째 및 네 번째 열임을 확인할 수 있다. 마지막으로 전체 이름을 범위로 표시해보자.

 

 

음?? 분명 Last Name의 Column 위치값인 3이 들어가 있음에도 불구하고, Middle Name까지만 출력되지 않음을 확인할 수 있다. loc[]과 달리 iloc은 마지막으로 지정된 Integer Location은 출력하지 않는데, List에서 범위 지정할 때와 동일한 결과라 보면 된다. Index의 경우도 마찬가지다.

 


 

다음 포스팅에서는 자료의 수정과 조건 검색에 대해 포스팅 할 예정이다.

 

 

Fin.

반응형

댓글