본문 바로가기

개발/파이썬

자주쓰는 명령어로 배우는 Pandas #1 : Pandas와 데이터 살펴보기

반응형

시작 전 당부

  • 앞으로 소개할 메소드들에 대해서, DataFrame이나 Series의 구분은 크게 하지 않았습니다. 대부분의 매소드들은 Series와 DataFrame 모두 사용 가능하며, 일부는 둘 중 하나에서만 적용됩니다.

  • 기본적인 사용 케이스들만 소개하며, 세부적인 인자 컨트롤 등은 다루지 않았습니다. 보다 세부적인 컨트롤을 원한다면, 직접 검색해가면서 찾아봅시다! Pandas API문서와 Pandas User Guide는 최고의 퀄리티를 자랑합니다.

  • 예시를 위해서 어색한 케이스가 있을 수 있습니다. 해당 부분들은 너그럽게 이해해주시면 감사하겠습니다. 또한, 틀린 부분이 있으면, 댓글로 남겨주시면 반영하도록 하겠습니다.😄

준비사항

실습을 위해 필요한 라이브러리

  • jupyter (jupyter notebook)
  • pandas (pandas)
  • faker (실습 데이터를 생성)
pip install jupyter pandas faker

*가상환경을 만드는 것을 권장합니다.

Pandas란?

Pandas는 유용한 데이터 자료구조 (SeriesDataFrame)을 제공하는 파이썬 라이브러리입니다. 데이터 분석을 위해서 반드시 알아야 하는 라이브러리입니다. 개인적으로는 Pandas 하나만으로도 Python을 사용해야하는 이유가 되지 않을까 생각합니다. Numpy라는 벡터와 매트릭스 등을 다루는 라이브러리를 기반으로 하고 있으며, 데이터에 이름(label)을 붙일 수 있어서 보다 직관적으로 데이터를 다룰 수 있습니다.

그럼 SeriesDataFrame이 어떤 데이터 구조인지 알아봅시다.

pd.Series란?

Series는 1차원 어레이에 IndexName을 가지고 있는 데이터 구조입니다.

Series = 1d Array + Index + Name

import pandas as pd

series = pd.Series([1,2,3,4,5])
series

실행결과

여기서 우리가 입력한 [1, 2, 3, 4, 5] 이외에 [0, 1, 2, 3, 4]라고 되어 있는 부분이 Index입니다. Index는 위의 예와 같이 0부터 시작하는 숫자가 디폴트 값이지만, 직접 index와 name을 설정할 수도 있습니다.

series = pd.Series([1,2,3,4,5], index=["a", "b", "c", "d", "e"] name="alphabet")
series

실행결과

pd.DataFrame이란?

DataFrame은 2차원의 매트릭스에 Index와 Columns를 가지고 있는 데이터 구조입니다. Series를 여러 개 합친 것이라고 이해해도 좋습니다. 이때, Series의 Name들은 DataFrame의 Columns가 됩니다.

DataFrame = 2d Array (Matrix) + Index + Columns

import pandas as pd

df = pd.DataFrame({
    "number": [1, 2, 3, 4, 5],
    "alphabet": ["a", "b", "c", "d", "e"]
}, index=["가", "나", "다", "라", "마"])
df

실행결과

Series와 마찬가지로 Index를 직접 설정하지 않은경우 0으로 시작하는 숫자가 디폴터 Index가 됩니다.

데이터 살펴보기

이제 본격적으로 자주 사용하는 명령어(메소드)를 활용하면서 각 명령어들을 학습해보겠습니다. 우선 pandasfaker를 임포트하겠습니다. faker는 테스트에 사용할 수 있는 랜덤한 데이터를 생성하는 유용한 라이브러리입니다.

  • 라이브러리 세팅
import pandas as pd
from faker import Faker

# fake 데이터를 생성하기 위한 준비
Faker.seed(0)
fake = Faker()
  • 500개의 랜덤 데이터 생성, 데이터 프레임 만들기
data = [fake.simple_profile() for _ in range(500)]
df = pd.DataFrame(data)

HEAD & TAIL

굉장히 큰 데이터를 다루는 경우에, 데이터의 일부만을 확인하는 것이 전체적인 구조를 파악하는데 더 용이한 경우가 있습니다. 이때 사용할 수 있는 메소드가 headtail입니다.

  • 위에서부터 10개의 데이터만 추출
df.head(10)

실행결과

  • 아래 10개의 데이터만 추출
df.tail(10)

실행결과

위치(Position) 기반 인덱싱 (iloc)

인덱싱이란 데이터에서 원하는 부분을 추출하는 개념입니다. 따라서 위치 기반 인덱싱은 데이터 추출을 위치 기반으로 한다는 의미입니다. 예를 들어, 3번째 데이터부터 5번째 데이터를 추출하고 싶다고 하면 다음과 같이 쓸 수 있습니다.

# 3번째 데이터부터 5번째 데이터 추출
df.iloc[2:5] # 소괄호가 아니고 대괄호임에 주의!

주의!: 파이썬 언어관점에서는 0부터 인덱싱이 되기 때문에 3번째 데이터는 인덱스가 2이고, 5번째 데이터는 인덱스가 4입니다. 다만, df.iloc[2:4]로 쓸 경우에는 4를 포함하지 않기 때문에 5로 작성

실행결과

컬럼 역시 다음과 같이 위치기반으로 선택할 수 있습니다.

df.iloc[2:5, 0]

실행결과

앞에 아무것도 써주지 않으면 처음부터라는 의미입니다. 따라서 아래는 0번 컬럼부터 1번 컬럼까지 두 개의 컬럼을 선택합니다. (반대로 뒤에 아무것도 써주지 않으면 끝까지라는 의미입니다.)

df.iloc[[1, 2, 4], :2]

실행결과

df.iloc[:5, [1, 2, 3, 5]]

실행결과

위치기반 인덱싱에서 두개의 :뒤에 -1을 써주게 되면 순서를 뒤집을 수 있습니다. 아래의 코드는 인덱스를 처음부터 끝까지 선택하고 해당 결과를 뒤집은 결과를 보여줍니다.

df.iloc[::-1, :].head()

실행결과

레이블(Label) 기반 인덱싱 (loc)

레이블 기반 인덱싱은 말그대로 레이블로 원하는 데이터를 추출하는 개념입니다. 해당 개념을 이해하기 쉽게 우선 인덱스를 username으로 바꿔주겠습니다.

df = df.set_index("username")
df.head()

실행결과

df.loc["richard47"]

실행결과

df.loc[["richard47", "raymond09", "dave35", "bgiles"], ["name", "sex", "address"]]

실행결과

레이블 기반 인덱싱은 크게 설명이 필요하지 않을 거 같습니다. 😄 혹시 이해가 되지 않으신다면 코멘트로 남겨주세요.

행 ↔ 열 변환

간혹 데이터를 데이터프레임으로 만들다 보면, 내가 생각한 대로 Index와 Columns가 만들어지지 않고, 행과 열이 바뀌어 나타나는 경우가 있습니다. 이럴 때는 다음과 같이 쉽게 데이터의 행과 열을 바꿀 수 있습니다.

df = df.T
df.head()

실행결과

현재 실습에서는 행과 열을 바꿀 필요가 없으니 다시 원래대로 돌려줍니다.

df = df.T

이상으로 자주쓰는 명령어로 배우는 Pandas 1편을 마치겠습니다. 2편에서는 Index와 Columns를 조작하는 방법에 대해 알아보겠습니다. 궁금한 점이 있으시면 코멘트로 남겨주시면 감사하겠습니다.

반응형