brunch

You can make anything
by writing

C.S.Lewis

by 박경아 Apr 23. 2021

16. 데이터 분석을 위한 라이브러리, 판다스 (2)

지난 편에서 판다스의 기본 데이터 구조와 이들을 다루기 위한 기본적인 인덱싱과 슬라이싱에 대해 살펴보았다면, 이번에는 실제 판다스를 이용해 데이터의 특성을 파악하고 원하는 조건을 만족하는 데이터를 출력하기 위한 판다스의 고급 인덱싱 & 슬라이싱에 대해 배워보자. 


이번 판다스 편에서는 실제 캐글에 올라와 있는 자동차 보험회사의 고객 데이터를 활용해 데이터프레임을 조작하고 분석하는 법을 배워 보려고 한다. 



데이터 프레임 정보 확인하기


지난 번 배운대로 다운로드 받은 csv 파일을 캐글에 업로드하고 pd.read_csv( ) 함수를 이용해 데이터 프레임을 생성한다. 데이터프레임에 df라는 변수를 할당했다. 


df를 호출하면 9134 행 × 24 열을 가진 데이터 프레임이 나오고, 원본 파일에는 행 인덱스가 없었으나 자동으로 정수형 인덱스가 생겼다. 데이터의 크기나 종류 등을 확인할 수 있는 함수나 속성들을 활용해 데이터의 특성을 파악해 보자. 


참고로 우리는 앞서 df[‘A’]나 df.A를 통해 컬럼을 인덱싱할 수 있다고 배웠다. df[‘A’]가 파이썬의 기본 문법을 활용한 열 인덱싱이였다면 df.A는 데이터 프레임이 가진 속성(attribute) 중의 하나인 A를 이용한 인덱싱이였다.


먼저 df.head()는 데이터 프레임의 맨 위 5행을 출력해준다. 기본값이 5행인데, 괄호 안에 숫자를 넣으면 원하는 행 만큼 출력할 수 있다.


df.tail()은 반대로 데이터 프레임의 맨 아래서부터 5줄을 출력한다. head()와 tail()과 같은 함수는 처음과 끝의 데이터를 확인하고, 초기 데이터 형태나 성질을 파악하는 샘플 또는 첫 인상과 같은 역할을 한다고 할 수 있을 것이다. 


데이터프레임이 가진 모든 컬럼명을 모두 확인하고 싶다면 df.columns 속성을 사용하고, 인덱스는 df. index 속성을 사용해 확인할 수 있다.


컬럼별 데이터 유형을 알고 싶다면 dtypes를 붙이면 된다. 데이터 프레임의 24개 컬럼 가운데 object(문자열 등 객체형) 16개, float64(실수형) 2개, int(정수형) 6개이다. 


데이터에 빈 값이 있는 지 없는 지 알아보려면 isnull( ) 함수를 사용한다. isnull은 빈 값일 경우 True, 빈 값이 아닐 경우 False를 반환한다. 반대로 notnull( )은 빈 값일 경우 False, 빈 값이 아닐 경우 True를 반환한다. 

df.isnull( )


df.notnull( )


앞서 살펴본 컬럼명과 그에 따른 데이터 개수, 빈 값 여부, 데이터 종류를 한 번에 알 수도 있다. info 함수를 사용하면 앞에서 살펴본 내용을 한 꺼번에 확인시켜준다. 


df.describe( )를 사용하면 숫자형 데이터를 가진 모든 컬럼들의 기본적인 통계를 한 꺼번에 요약해 준다. 물론 개별 컬럼에 붙여 그 평균, 편차 등 데이터를 요약하는 것도 가능하다. 

df.describe( )



특정 컬럼이 어떤 데이터 값을 가졌는지 궁금하다면 unique( ) 함수를 붙이면 된다. 이 함수는 개별 컬럼 데이터의 유니크 값을 확인해 준다. 그리고 그 유니크 값의 개수가 궁금하다면 n을 추가해 nunique( ) 함수를 사용할 수 있다.


특정 컬럼의 데이터 유니크값 별로 그 개수가 궁금하다면 value_counts( ) 함수를 사용하면 된다. value_counts( )는 유니크값 별로 개수를 세주는 역할을 한다. 그래프로 보자면 해당 값별로(x축 값)로 그 개수(y축 값)를 나타내주는 막대 그래프라고 생각할 수 있을 것이다. 


고급 인덱싱 & 슬라이싱


앞서 파이썬의 기본 문법을 활용한 데이터 프레임의 인덱싱과 슬라이싱에 대해 알아보았다. 리스트의 인덱싱과 비슷했지만 2차원 데이터인만큼 1) 행에 대해 열을 우선한다던지 2) 행의 경우 반드시 슬라이싱으로 사용해야 한다는 점 등의 차이가 있었다.


넘파이가 쉼표를 사용한 (행 인덱스, 열 인덱스) 형식의 2차원 인덱싱을 지원했던 것처럼 판다스 역시 특별한 인덱서(indexer) 속성을 통해 2차원 인덱싱을 지원한다.


loc : 라벨 기반의 2차원 인덱싱
iloc: 라벨과 상관없이 물리적인 숫자(순서)를 나타내는 정수형 인덱싱


loc는 행과 열에 주어진 인덱스를 라벨로 사용하는 라벨 기반 인덱싱이다. 만약 행과 열에 인덱스가 없다면 정수형 인덱스를 기본으로 한다. iloc도 그렇지만 인덱스를 우선 하나만 넣으면 행(row)을 선택하며, 라벨로 인덱싱과 슬라이싱을 하기 때문에 마지막 값이 포함된다.

인덱스를 우선 하나만 넣으면 행을 선택한다.
loc를 이용한 2차원 인덱싱 & 슬라이싱


반면, iloc는 데이터 프레임의 인덱스와 상관없이 데이터프레임에서 데이터의 숫자적인 자리(위치)에 따라 데이터를 선택하는 방식이다. 자리(인덱스 넘버)를 이용한 파이썬 기본 문법과 마찬가지 원리로 슬라이싱에서 마지막 자리는 포함되지 않는다.

iloc을 활용한 슬라이싱


loc와 iloc를 이용한 인덱싱의 공통점은 행과 열의 2차원 인덱싱을 할 수 있고, 둘 다 행을 우선한다는 점이다. 다만, 데이터 집합에는 의미있는 인덱스들이 있고 데이터 사이즈가 큰 경우가 많아 일일이 행이나 열의 위치를 세는 것도 힘들어서 일반적으로 loc를 사용하는 경우가 더 많을 것 같다.


그렇다면 지금까지 배운 파이썬의 기본 문법과 판다스의 인덱서 속성을 이용한 2차원 인덱싱 & 슬라이싱을 종합하면 다음과 같이 정리할 수 있을 것이다.




컬럼 선택

df['column'] or df.column


여러 개 컬럼 선택

df[리스트]               #파이썬 문법인 (:)이 아니라 라벨의 리스트를 넣는데 주의


행 선택

df.loc[ "row"  ]


행 슬라이싱

df.loc[ "row1" :  "row2"] or  df.loc[리스트]


특정 행의 특정 컬럼값

df.loc[ "row" , "column" ]  


숫자적인 위치로 인덱싱하기

df.iloc[행번호,  열번호]



판다스 데이터프레임 정보 확인하기와 고급 인덱싱 & 슬라이싱 연습

https://www.kaggle.com/kyungapark/pandas-indexing-slicing



# 참고자료

1. Learn Pandas Tutorials

https://www.kaggle.com/learn/pandas

2. 판다스(Pandas) and 넘파이(Numpy) and 맷플롭립(Matplotlib)

https://wikidocs.net/32829

3. 10 minutes to pandas

https://pandas.pydata.org/docs/user_guide/10min.html#min

4. 데이터사이언스 스쿨 -  판다스 패키지 소개 편

https://datascienceschool.net/

매거진의 이전글 15. 데이터 분석을 위한 라이브러리, 판다스 (1)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari