반응형

 

본 포스팅은 판다스의 공식 튜토리얼 문서

(https://pandas.pydata.org/docs/getting_started/intro_tutorials/03_subset_data.html)를 참고하여 학습한 내용을 정리한 것입니다.

 

· 깃허브: https://github.com/PSLeon24/Research_python/blob/main/pandas/pandas2.ipynb

 

GitHub - PSLeon24/Research_python: research deep

research deep. Contribute to PSLeon24/Research_python development by creating an account on GitHub.

github.com

 

본 포스팅은 실습을 위해 titanic.csv 데이터를 사용합니다.

링크: https://github.com/PSLeon24/Research_python/blob/main/pandas/titanic.csv

 

데이터프레임의 부분집합을 어떻게 선택할 수 있을까?

- How do I select a subset of a DataFrame?

 

먼저, 판다스를 임포트해주고, 판다스의 read_csv() 함수로 titanic.csv 파일을 불러와준다.

그리고, head() 함수로 상위 5개의 데이터만 찍어볼 수 있다.

각 컬럼 이름에 대한 내용은 코드의 주석에 설명을 남겨두었다.

 

이 데이터의 전체 행과 열의 갯수가 궁금하면 titanic.shape로 알아볼 수 있다.

(891, 12)로 출력된 것을 확인할 수 있는데, 순서대로 (행의 갯수, 열의 갯수)이다.

즉 12개의 세로 열에 대해서 891개의 행이 존재한다는 뜻이다.

 

자, 만약 여러 열(columns) 중에서 나이에 해당하는 Age 열의 시리즈만 추출하고 싶으면 어떻게 해야할까?

파이썬에서 딕셔너리 구조에서는 {key: value}의 형태로 자료들이 이루어져 있고 value 값을 불러오기 위해서는 dict_name['key']의 형태로 불러온다. 이와 비슷하게 판다스에서도 특정 컬럼의 시리즈를 추출하기 위해서는 df_name['column_label']와 같이 시리즈를 추출할 수 있다.

정말 시리즈로 추출되었는지 아래를 통해 확인해보자.

type() 함수로 확인한 결과, DataType이 Series임을 확인할 수 있다. 또한,

shape를 찍어봐도 열의 수는 공란이고 행만 891개가 있음을 확인하여 시리즈가 추출되었음을 확인할 수 있다.

 

이렇게 하나의 시리즈를 추출하는 방법을 익혀보았다. 하지만 데이터를 가공하거나 처리하다보면 여러 column의 데이터를 다루어야 할 때도 있다. 아래의 예를 통해 살펴보자.

필자는 타이타닉 데이터프레임에서 나이와 성별에 대한 시리즈를 추출하였다. 조금 전 나이의 시리즈만 추출했을 때와 차이가 보이는가?

  • 나이만 추출: ages = titanic['Age']
  • 나이와 성별 추출: age_sex = titanic[['Age', 'Sex']]

그렇다. 하나의 시리즈만 추출할 경우 []를 하나만 사용하고, 두 개 이상의 시리즈를 추출할 경우에는 이미 있는 [] 대괄호 안에 다시 []를 사용해 열이름을 리스트 형태로 넣어서 추출해야 한다. 이 경우는 시리즈가 추출이 되는걸까? 아니다. 이 경우는 시리즈로 이루어진 데이터프레임이 출력된다. 타입(type)과 형태(shape)를 확인해보자.

 

또한, 가끔씩은 특정 조건에 해당하는 경우만 추출하고 싶을 때도 있을 것이다.

예를 들면 타이타닉 데이터에서 나이가 35살을 초과하는 경우만 추출하고 싶을 경우에는 어떻게 할까?

앞선 예제들을 봤을 때 먼저 타이타닉 데이터 중 나이에 해당하는 시리즈를 추출해야 한다.

  • titanic["Age"]

위와 같이 하면 시리즈가 추출될 것이다. 여기에서 비교연산자 중 '>' 를 활용해보자.

이렇게하면 시리즈의 값들이 모두 boolean형으로 바뀌고 만약 35를 넘는 값인 경우 True를, 이하인 값들은 False를 반환하게 된다.

이제 이 조건식을 시리즈를 추출하기 위해 titanic[] 의 대괄호 안에 넣어주면 원하는 부분의 데이터프레임만 추출된다.

35 이하의 값은 제외하여 행의 수가 많이 줄어들었음을 확인할 수 있다.

 

이제, isin() 함수에 대해서도 한번 알아보자.

isin() 함수는 열이 list의 값들을 포함하고 있는 모든 행들을 골라낼 때 주로 쓰인다. 무슨 말인지 잘 와닫지 않는가?

만약, titanic["Pclass"].isin([2, 3])라고 한다면 Pclass 열에 해당하는 행 데이터들 중 2와 3인 값들만 True를 반환하고 나머지는 False를 반환하게 된다.

그래서 만약 타이타닉 데이터 중에서 2 클래스와 3 클래스에 탑승한 데이터프레임을 추출하고자 한다면 아래와 같다.

위 방법을 아래와 같이 논리연산자 중 or(|)를 사용해서 똑같은 결과값을 추출할 수 있다.

 

데이터를 처리하다 보면 결측치(NaN, Null)를 처리해야 할 경우가 많다.

결측치를 처리하는 방법은 여러 가지가 있지만 그 중에서도 결측치를 무시한 값만 계산하는 방식이 있다.

이번 실습에 사용되는 타이타닉 데이터에도 실제 결측치가 존재한다.

이때, 결측치가 아닌 값만 반환하기 위해서는 notna() 함수를 사용하면 된다.

예를 들어 titanic["Age"].notna()를 해주면 나이에 해당하는 시리즈 값들 중 결측치가 아닌 값만 True로 반환된다.

이를 통해 데이터프레임을 추출하면 아래와 같다.

원래 타이타닉 데이터프레임은 총 891개의 행과 12개의 열로 이루어져 있었으나, 나이 열에 해당하는 행의 결측치를 제외한 데이터프레임에서는 714개의 행으로 줄어들었음을 확인할 수 있다.