프로그래밍 언어/python

[python 기초 7] pandas 시작하기

이현찬 2023. 4. 16. 14:43
728x90

pandas는 python에서 기본적으로 제공하는 라이브러리는 아니다. 하지만 프로그램을 통해 데이터를 불러오고, 처리하고, 시각화하는 과정에서 거의 모든 경우에 사용하게 되는 open-source 라이브러리다. pandasSeriesDataFrame 두 종류의 데이터 구조를 제공하고 Series는 index로 접근할 수 있는 1차원 형태의 데이터를, DataFrame은 index와 column으로 접근할 수 있는 2차원 데이터를 다룬다. DataFrame으로 excel, DB에 존재하는 데이터를 불러와 python에서 편리하게 정렬, 분류, 연산, 분석을 할 수 있다. 이번 포스팅에서는 pandas의 DataFrame 자료 구조와 ilocloc으로 일부 데이터에 접근하는 방법에 대해 학습한다.

pandas 설치

pandas는 python 패키지 매니저인 pip 명령어를 사용해 설치할 수 있다. 아래 명령어를 cmd에 입력하는 것으로 패키지 설치가 진행된다.

pip install pandas

DataFrame이란

앞서 설명한 것과 같이 DataFrame은 2차원 형태의 table 데이터를 python에서 다룰 수 있도록 해주는 자료 구조이고 excel의 spreadsheet나 db의 table과 유사한 개념이다. 다시 말하면 각각의 column은 특정한 자료형(문자열, 정수, 실수 등)과 이름을 가지며 이름으로 해당 column의 데이터에 접근이 가능하고, 여기에 index로 column 내 특정한 데이터에 도달할 수 있다는 의미이다. 아래의 그림은 DataFrame의 예시이고 Mary라는 데이터는 name column의 1번 index에 저장되어있다.

데이터 분석을 할 때 주로 사용하는 IPython notebook 파일(.ipynb)에서 DataFrame의 내용을 확인하는 방법은 다음과 같은 명령어가 있다.

  1. df.head(x) : DataFrame의 column label과 함께 앞에서 x개의 row를 출력
  2. df.tail(x) : DataFrame의 column label과 함께 뒤에서 x개의 row를 출력
  3. `df.describe() : column별 통계 정보를 요약하는 함수. 총 데이터의 수, 평균, 분산과 최소값부터 최대값까지 반환
  4. display(df) : 출력할 수 있는 한계까지 df DataFrame을 출력

DataFrame 데이터에 접근하기

List 데이터의 일부 데이터를 가져오는 slicing과 같이 DataFrame도 일부 데이터를 가져올 수 있다. pandas는 slicing에 두 가지 옵션을 제공하는데 .loc.iloc이 있다. 두 방법은 DataFrame의 method로 구현되어있고 상황에 따라 적합한 방식으로 slicing해 데이터 filtering, sorting 등 데이터 처리에 활용할 수 있다. .loc.iloc으로 생성한 subset은 데이터를 복사해 새로 만드는 것이 아니라 원본 데이터 중 조건에 맞는 부분의 주소를 가져오는 것이기 때문에 subset 데이터를 수정하면 원본 데이터도 함께 수정됨을 주의해야 한다.
예시에서 사용할 DataFrame을 생성하는 코드는 아래와 같다. 대부분의 경우 이미 저장되어있는 데이터를 DataFrame으로 불러와 사용하기 때문에 이와 같은 방식으로 생성할 일은 많지 않기 때문에 설명은 skip한다. 아래 코드를 실행하면 위의 이미지와 같은 DataFrame을 df에 저장한다.

import pandas as pd

data = {'name': ['John', 'Mary', 'Tom', 'Jane'],
        'age': [25, 30, 35, 40],
        'gender': ['M', 'F', 'M', 'F']}

df = pd.DataFrame(data)

loc

이 방법은 column과 index의 label에 기반해 데이터에 접근한다. 예시를 통해 loc 메소드를 사용해 데이터에 접근하는 방법을 알아보자. 위에서 생성한 DataFrame의 객체인 df의 데이터에 접근하기 위해 df.loc[ "index label", "column label"] 명령어를 사용한다.

  1. 하나의 데이터에 접근

아래의 코드로 1번 index의 name 데이터를 가져온다.

value = df.loc[1, 'name'] 

  1. 연속된 복수 데이터에 접근

아래의 코드로 0번~2번 index, name~age 까지 데이터를 가져온다. 여기서 주의할 점은 list나 tuple과 달리 ['index start':'index end','column start':'column end']로 slicing할 때 end 값까지 포함해 반환한다는 점을 주의해야한다.

value = df.loc[0:2, "name":"age"] 

  1. 연속적이지 않은 복수 데이터에 접근

만약 연속적이지 않은 복수의 데이터에 접근이 필요하다면 [[index list],[column list]]로 접근할 수 있다.

value = df.loc[[0,3], ["name","gender"]] 

iloc

이 방법은 column과 index의 순서에 기반해 정수 입력으로 데이터에 접근한다. 접근하고자 하는 데이터의 행과 열의 순서를 알고 있는 경우 사용한다. loc과 같은 방식으로 하나의 데이터, 복수의 데이터에 접근할 수 있다. loc의 예시에서 접근했던 데이터를 아래와 같이 행과 열의 순서에 기반해 접근할 수 있다.
기존에 index의 label은 순서로 정의되어있어 차이가 없고, 각 column들은 name은 0, age는 1, gender는 2로 iloc을 사용해 접근한다.

# 하나의 데이터에 접근
## value = df.loc[1, 'name'] 
value = df.iloc[1, 0]

# 연속된 복수 데이터에 접근
## value = df.loc[0:2, "name":"age"] 
value = df.iloc[0:2, 0:1]

# 연속적이지 않은 복수 데이터에 접근
## value = df.loc[[0,3], ["name","gender"]] 
value = df.iloc[[0,3], [0,2]]

Fancy indexing

앞서 lociloc을 사용해 DataFrame의 배열에 접근하는 방법을 설명했다. 위의 예시와 같이 사용할 때는 원하는 데이터의 index와 column 정보 모두을 알고 있어야 하기 때문에 상당히 많은 정보가 필요하다. 프로그램을 활용해 데이터를 처리할 때 적게는 수 백개부터 수 십만개의 row를 갖는 데이터를 다루게 되는 상황에서 이와 같이 hard coding하는 방식으로 원하는 데이터에 접근하는 것은 거의 불가능에 가깝다.
이 때 Fancy indexing, boolean indexing이라고 불리는 방법을 사용하면 특정 조건에 맞는 데이터를 불러올 수 있다. boolean indexing은 True, False로 구성된 mask를 만들어 loc이나 iloc의 인자로 전달해 True에 해당하는 row의 데이터만을 가져올 수 있다.
만약 관심있는 데이터가 30세 이상의 사람에 대한 정보라면 다음과 같이 mask를 생성할 수 있다.

mask = (df['age'] >=30)

이 mask는 다음과 같이 index 별로 TrueFalse 값을 갖게 된다. 나이가 25세인 John의 데이터만 False를 갖는 것을 볼 수 있다. 이 mask를 loc의 인자로 전달하면 조건에 맞는 데이터로 구성된 subset DataFrame을 가져올 수 있다. 아래 코드를 실행해 결과를 확인해보자.

# 30세 이상 사람의 데이터 subset
subset = df.loc[mask]

# 30세 이상 사람의 이름 subset
subset_name = df.loc[mask, 'name']

데이터 불러오기

pandas라이브러리를 활용하면 한 줄의 코드로 csv, excel, json, html, sql db로부터 데이터를 불러올 수 있고 각각의 명령어는 read_ + csv, excel, json, html, sql이다. 그 중 가장 많이 활용하는 방식은 csv로 부터 데이터를 읽어오는 것이 가장 널리 사용되는 방법이다. 실제로 kaggle과 같은 데이터 분석 경진대회 플랫폼에서 table 형태의 데이터를 다루는 대회는 대부분 csv 파일로 데이터를 배포한다. 아래와 같이 한 줄의 code로 csv 파일에 존재하는 데이터를 불러와 DataFrame으로 변환할 수 있다.

import pandas as pd

df = pd.read_csv("data.csv")

결론

이번 포스팅에서는 pandas 라이브러리의 DataFrame 자료 구조와 loc, iloc으로 일부 데이터에 접근하는 방식과 fancy indexing으로 조건에 맞는 데이터를 filtering하는 것 까지 학습했다. 가능하면 index와 column의 label로 데이터에 접근할 수 있는 loc을 사용하는 것이 바람직하나 종종 iloc을 사용하는 것이 더 적합한 상황이 있어 필요에 따라 사용하면 된다. 그리고 보통의 경우 불러올 index를 hard coding하는 것이 아니라 특정 조건에 맞는 일부 데이터를 불러오는 Fancy indexing을 사용하기 때문에 이와 관련된 내용은 추가적으로 학습 및 연습이 필요하다.