본문 바로가기
Python/Python DataAnalysis

[Python Data Analysis] 5. DataFrame, Index 관련 매서드

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

 

 

 

 

지난 포스팅에서는 데이터 분석 모듈인 Python Pandas의 가장 기본이 되는 객체형인 DataFrame의 구조와, 이를 탐색하는 방법에 대해 간략하게 알아보았다. DataFrame은 기본적으로 행인 Index와 열인 Column으로 이루어진 2차원 구조, 즉 표의 형태를 이루고 있음을 확인할 수 있었다.

 

이번 포스팅에서는 DataFrame의 Index와 관련된 매서드 및 활용법에 대해 알아보려 한다. Index의 경우, 각 행의 고유번호를 의미하는 경우가 많은데(순번, 수험번호, ID 등), 이 때문에 특정 정보를 나타내는 가장 대표적인 정보라고 볼 수 있다. 데이터베이스에서는 보통 Primary Key의 개념으로 많이 사용된다.

 

 

오늘 학습할 매서드는 아래와 같다.

 

# pandas.DataFrame.index                       :    DataFrame의 Index 정보 표시

# pandas.DataFrame.index.name("INDEX지정명"): DataFrame의 Index 필드명 지정

# pandas.DataFrame.reindex(리스트형 변수) :    DataFrame의 Index 중 출력할 index를 지정

# pandas.DataFrame.reindex_like(DataFrame변수): DataFrame변수의 Index와 유사한 형태로 index 정보 변경

# pandas.DataFrame.set_index("특정Column명") : DataFrame의 특정 필드를 Index로 지정

# pandas.DataFrame.reset_index()                   : DataFrame에서 Index 필드를 DataFrame의 데이터로 반영

# pandas.DataFrame.sort_index()                    : DataFrame에서 index를 오름/내림차순 정렬

# pandas.DataFrame.drop(Index)                   : DataFrame에서 특정 index를 제외하고 출력

# pandas.DataFrame.head(n)                        : DataFrame의 앞 n 행 출력

# pandas.DataFrame.last(n)                          : DataFrame의 뒤 n 행 출력

 

 

실습을 위해, 아래와 같이 매서드를 생성하도록 하자.

 

 

 

1. Index 표시 - pandas.DataFrame.index

 

DataFrame 객체의 index는 DataFrame의 index 정보를 나타낸다. 위의 예시에서 DataFrame의 새로 행 가장 앞 쪽을 보면, 순번과 같이 0부터 2까지 숫자가 부여된 필드가 보이는데 이를 index라고 한다. 일반적으로 아무 옵션 없이 DataFrame을 생성하면 0부터 순차적으로 index 번호가 부여된다.

 

Index가 수의 형태로 일정한 규칙을 가지고 있다면, 위와 같이 Range 형태로 결과값이 반환된다. 그렇지 않은 경우 리스트 형태로 반환된다.

 

 

 

2. Index에 필드명 지정하기 - pandas.DataFrame.index.name

 

index의 하위에 name이라는 클래스 변수가 존재하는데, 이 클래스 변수는 index가 위치한 새로행의 필드명을 저장한다. 기본적으로는 이 값이 빈 값(null)으로 지정되나, 아래와 같이 index의 필드명을 지정하는 것도 가능하다.

 

 

3. 특정 Index 정보만 출력하거나 index 출력 순서 변경 - pandas.DataFrame.reindex(NEW_INDEX)

 

필자는 DataFrame에 작성된 세 사람의 인적정보 중 Alex와 Chales의 정보만 필요하다고 가정해보자. DataFrame의 reindex 함수를 사용하면, 매우 많은 Index 정보 중, 확인을 원하는 특정 index만 화면에 출력하는 것이 가능해진다. 

 

 

reindex 사용 시, new_index에 들어가는 index 값이 기존의 DataFrame Index에 존재하지 않다면, 이 Index의 정보는 모두 NaN(Not a Number)으로 표시된다.

 

 

4. 특정 DataFrame의 index 지정 규칙 적용 - pandas.DataFrame.reindex_like(DATA_FRAME)

 

필자는 위에서 reindexing 한 DataFrame을 df2라는 새 DataFrame 변수에 저장하였다. 

 

 

이 상태에서 df2의 index도 df와 같은 index로 변경한다고 가정해보자. 이 때 사용하는 매서드가 reindex_like라는 매서드이며, 이 매서드의 인자로 참조할 index가 박혀있는 DataFrame 객체를 지정해주면 된다.

 

 

물론, reindexing 결과, 기존의 DataFrame에 존재하지 않던 index 정보는 NaN으로 표시된다.



5. Index 값을 DataFrame의 데이터로 지정하기: DataFrame.reset_index(drop, inplace)

 

위의 예시에서 Index는 일종의 순번처럼 사용되었다. 실제 DataFrame으로 변환된 data 변수에는 "Number"라는 필드명과 하위값들이 지정되어 있지 않지만, 필자는 순번 역시 DataFrame 내에서 사용할 수 있도록 만들고 싶다. 이때 사용하는 DataFrame 클래스의 매서드로 reset_index()가 있다. reset_index는 DataFrame의 Index 필드의 수정에 사용하는 매서드로, 매서드에 사용하는 인자들의 값에 따라 DataFrame 내부에 위치시킬수도 있고, 단순히 Index를 삭제할 수 있다. 다음의 예를 보자.

 

 

필자가 미리 정의한 df 변수의 DataFrame Index 명은 Number이다. reset_index() 매서드를 사용하면 이 "Number" index명이 "name", "age", "nation"과 동일하게 하나의 필드명으로 인식된다. 하지만, 단순히 reset_index를 사용하는 것으로는 기존의 DataFrame인 df의 값을 변화시키지 못한다. 위의 예시를 보면 알겠지만, reset_index 사용 이후에도 df의 index 명인 Number는 여전히 index 위치에 머무르고 있다. 

 

그렇다면, reset_index()로 index 필드를 실제 데이터 값 필드 영역으로 이동시킬 수 있는 방법에는 무엇이 있을까? 하나는 새로운 DataFrame 변수를 정의한 뒤, df.reset_index() 값을 부여하는 방법이 있고, 다른 하나는 reset_index의 inplace 인자를 사용하는 방법이 있다. 

 

좌측이 reset_index() 값을 복사하는 방법, 우측의 화면이 Inplace 인자를 사용한 방법이다.

 

reset_index의 inplace 인자는, reset_index의 결과값을 현재의 DataFrame에 적용할지 말지를 결정하는 인자다. 따라서 이 값은 True와 False의 Boolean 값으로 지정해주면 된다. 기본값은 inplace=False로 지정되어 있기 때문에, reset_index()의 사용에도 DataFrame의 값이 변화되지 않는 것이다. 

 

 

번외로, 필자가 지정한 index의 이름인 "Number"를 삭제하기 위해 reset_index() 매서드에 drop 인자를 쓰는 방법이 있다. drop=True 설정 시, 지정한 index 이름이 사라지는 것을 확인할 수 있다. 하지만, index.name="" 으로도 충분히 초기화가 가능하기 때문에 많이 사용하는 방법은 아닌듯 하다.

 

 

 

5. 특정 필드 데이터를 Index column으로 지정하기 : DataFrame.set_index()

 

DataFrame 생성 시, pandas는 0부터 순차적으로 데이터 행에 index를 부여하는 것이 기본값이다. 하지만, 데이터를 다루다보면 특정 행의 값을 정의할 수 있는 데이터가 포함된 경우가 많이 있기 때문에 이들 값을 index 열에 위치시키는 작업이 필요한 경우가 있다. 위의 예시에서, 모든 데이터를 구분할 수 있는 가장 좋은 Column 값은 이름이다. 따라서 필자는 이름(name) column을 index column으로 지정하여 데이터를 저장하려 한다. 

 

특정 필드의 데이터를 index column으로 지정하는 매서드는 DataFrame 클래스 내에 존재하는 set_index()다 .이 set_index는 DataFrame의 column 명 중 하나를 인자로 사용한다. 

 

set_index() 함수 역시, reset_index와 마찬가지로, inplace 인자값을 True로 명시하지 않을 시 DataFrame에 결과값이 반영되지 않는다. 

 

Index column을 "name"값으로 변경한 뒤, loc 함수로 Breta를 검색하면 2번째 행에 위치한 Breta의 인적사항이 화면에 출력된다. "name"값을 index column으로 지정하기 전에는 df.loc[1]로 Breta의 인적사항을 조회할 수 있었다는 것을 기억하자. 

 

 

6. 데이터의 오름/내림차순 정렬 : DataFrame.sort_index()

 

이제, 필자가 만든 데이터에서 Index 값을 기준으로 오름/내림차순 정렬을 진행해보자. 데이터의 정렬은 DataFrame 클래스의 sort_index() 매서드를 사용한다. 필자는 위의 인적 사항 Data를 나이가 적은 순에서 많은 순으로 정렬해보고자 한다. 따라서 "age" 필드를 index로 지정한 뒤, sort_index() 매서드로 정렬을 진행할 것이다.

 

원래 입력되었던 값이 오름차순이었기 때문에, 데이터의 순서는 변환되지 않았지만 sort_index가 오름차순으로 지정된 것이 위의 결과다(데이터를 변환하여 테스트하는 것은 각자 진행해보자... 만들기 귀찮다). 그럼, 내림차순 정렬은 어떻게 진행해야 할까?

 

sort_index() 매서드의 인자 중, ascending이라는 인자가 있다. index의 정렬을 오름차순으로 할 것인지 말 것인지를 결정하는 Boolean 인자이며, 기본값을 True로 설정되어 있다. 따라서 위의 결과도 오름차순(True)로 나타난 것이다. 만약 저 값을 False로 지정하여 실행한다면 아래와 같이 Age 값이 역순으로 출력되는 것을 확인할 수 있다.

 

 

 

7. 특정 행을 제외한 데이터 출력하기: DataFrame.drop()

 

다음으로 특정 행을 제외한 데이터를 출력하는 방법에 대해 알아보자. 필자가 위의 세 명의 인적사항 중, Breta를 제외한 나머지 인원의 인적 사항이 필요하다고 가정해보자. DataFrame 클래스는 drop이라는 매서드를 가지는데, 이 drop() 매서드는 특정 index 또는 특정 필드값을 제외한 데이터를 화면에 출력하는 기능을 가지고 있다. 필자는 아래의 방식으로 Breta를 제외한 나머지 인원의 정보를 확인하였다.

 

마찬가지로, 결과로 출력된 값을 기존 DataFame에 반영하기 위해서는 inplace=True 인자를 사용해야 한다. 

 

만약, Breta를 제외한 나머지 정보를 삭제하고 출력하고 싶다면, drop의 인자값들을 List 형태로 묶어 지정하면 된다.

 

 

추가로, 이 drop() 매서드는 axis라는 인자를 가지고 있는데, axis가 0인 경우 index를 제외, 1인 경우 column을 제외한다. drop() 매서드의 index값은 0이 기본으로 지정되어 있기 때문에 별도의 axis값을 인자로 지정하지 않더라도 index 정보를 제외하고 화면에 출력할 수 있게 된다.

 

 

참고로, axis 값은 0과 1 대신 "index", "columns"로도 사용이 가능하나, 추후 axis 인자는 "index", "columns"로 대체될 예정인 듯 하다. "index"와 "columns" 인자로 drop() 매서드를 사용하는 방법은 다음과 같다.

 

 


다음 포스팅에서는 데이터 파일로부터 DataFrame 형성 방법, DataFrame의 데이터 확인 및 DataFrame 값을 파일로 만드는 내용에 대해 작성하려 한다. 이전 포스팅에서 to_ 및 read_ 매서드로 간략하게 설명하긴 했지만, 추가 설명이 필요할 듯 하다.

 

 

 

 

Fin.

반응형

댓글