Pandas 들어가기

지원·2021년 1월 27일
0
post-thumbnail

Pandas가 무엇일까?

Pandas는 파이썬에서 구조화된 데이터를 보다 쉽고 빠르게 처리할 수 있도록 도와준다.

Pandas는 주로 numpy와 함께 결합하여 데이터 처리 및 통계 분석 등에서 강력한 기능을 제공함으로써 파이썬 데이터 처리의 '표준'으로 빠르게 자리잡아 왔다.

가상환경에 설치하기

파이썬의 장점 중 하나는 다양한 라이브러리를 사용할 수 있다는 점이다. 그런데 여러 프로젝트를 하나의 환경에서 개발하다 보면, 라이브러리 사이의 상호 의존성으로 인한 충돌이 발생할 수 있다.

이러한 문제를 해결하기 위해 '가상환경'을 설정하는 것이 좋다. 여기서는 conda를 이용해 가상환경을 생성하고 실행하도록 한다.

conda create -n ml python ## 'ml' 가상환경 생성
conda activate ml # 'ml' 가상환경 실행
conda install pandas # 가상환경에 pandas 설치

설치를 마치면, 아래와 같이 pandas를 import 할 수 있다. pandas는 관례적으로 pd로 나타낸다. (DataFramedf 변수에 담는 경우가 많다. 이 글에서도 이러한 관례를 따르기로 한다.)

import pandas as pd

데이터 살펴보기

Pandas에서 데이터 테이블 전체를 포함하는 객체를 DataFrame이라고 부른다. 데이터프레임은 한 개 이상의 열(column)으로 이루어지는데, 각 열은 pandas에서 벡터를 표현하는 방식인 Series 객체로 이루어져 있다. 행렬을 각각의 행백터가 모여있는 것으로 생각하는 것과 비슷하다.

Numpyarray와 같이 Series는 하나의 데이터 타입만을 가질 수 있지만, 하나의 DataFrame에 포함된 서로 다른 열은 서로 다른 데이터 타입을 가질 수 있다.

SeriesDataFrame은 모두 인덱스(index)를 가지는데, 이는 숫자 뿐만 아니라 문자로 지정할 수 있다. 별도로 지정하지 않으면 0부터 시작되는 정수를 기본값으로 갖는다.

데이터 불러오기

Pandas는 csv, txt, xlsx 등 여러 형태의 파일로부터 데이터를 불러올 수 있다. 아래 코드는 웹에서 csv 데이터를 불러와 DataFrame에 담는다.

data_url = 'https://...' # 데이터 URL
# 데이터 로드 (seperator은 빈 공간, column 이름 없음)
df_data = pd.read_csv(data_url, sep='\s+', header=None)

DataFrame을 직접 생성할 수도 있지만, 다른 형식의 데이터로부터 불러오는 방식을 택하는 것이 일반적이다.

데이터 미리보기

head 함수를 통해 DataFrame의 일부를 출력해 데이터 구조를 파악할 수 있다.

데이터 다루기

원하는 데이터 추출하기

인덱싱

lociloc을 이용하여 인덱싱(indexing)을 할 수 있다. lociloc의 차이는pandasDataFrame을 커스터마이징 할 수 있다는 점에서 비롯된다.

즉, loc은 인덱스 이름에 해당하는 데이터를, iloc은 인덱스 위치에 해당하는 데이터를 불러온다. 아래 예제를 보자.

# NaN을 기본값으로 갖는 Series 생성
s = pd.Series(np.nan, index=[5,6,7,1,2,3])

print(s.loc[:2])  #1
print(s.iloc[:2]) #2

1의 경우 2에 해당하는 다섯 번째 데이터까지가 해당되며, 2의 경우 파이썬 List와 같이 처음 두 개의 데이터를 불러온다.

조건에 맞는 데이터 선택

PandasSeries 전체에 대한 비교 연산을 지원한다. 데이터 타입에 적절한 연산이라면, True 혹은 False로 이루어진 새로운 Series를 반환한다. 예를 들면, 나이가 30세보다 많은지 여부를 알고 싶다면, 다음과 같은 코드를 이용할 수 있다.

if_more_than_30 = df.age > 30

조건에 맞는 데이터만을 추출할 수 있는데, 위 조건문을 인덱싱하듯이 사용하면 된다. 이를 'boolean index'라고 부른다.

ages_more_than_30 = df.age[df.age > 30]

새로운 데이터 추가하기

DataFrame에 새로운 열(column)을 추가하는 방법은 파이썬에서 Dictionary에 새로운 키와 값을 추가하는 것과 매우 유사하다.

데이터 삭제하기

열 삭제

다음의 세 코드는 모두 df로부터 age 열을 삭제한다.

df.drop('age', axis=1, inplace=True) # 1
del df['age'] # 2
# age 열이 첫 번째 열이라고 가정
df[df.columns[1:]] # 3

첫 번째 줄의 inplace 인수에 True를 지정하면, df 원본을 수정한다. 이는 drop을 비롯한 많은 함수에 인수로 존재한다. (추후에 자세히 다룰 예정)

행 삭제

위에서 drop method로 열을 삭제하고자 axis를 1로 대입했었다. 사실 이 함수에서 axis 기본값은 0이다. 즉, 아무것도 지정하지 않는다면 행을 삭제하라는 의미인 것이다.

행을 삭제할 때는 인덱스 이름(위치가 아니다 - lociloc의 차이를 기억하자)을 이용한다.

데이터 변환하기

Series 객체에는 파이썬의 List와 같이 map 내장함수를 사용할 수 있다.

한편, DataFrame에는 replace 함수가 있는데, 데이터 변환시 많이 사용한다. 다음과 같이 str 데이터를 int 데이터로 변환하는 분류 문제를 예로 들 수 있을 것이다.

# 1. dict 이용
df.sex.replace({'male': 0, 'female':1})

# 2. list 이용
df.sex.replace(['male', 'female'], [0, 1])

축 교환

DataFrame의 행과 열을 전치시키고 싶다면, T 속성을 사용할 수 있다. 이는 Numpy에서 행렬을 전치시킨 것과 매우 유사하다.

중복값 다루기

unique 함수는 Series에서 중복값을 제외하여 반환한다. 한편, duplicated는 중복값 여부를 판별하여 SeriesTrueFalse로 나타낸다. duplicated와 boolean index의 조합으로 중복값을 추출할 수 있으며, (unique 함수와 같이) 중복값을 제외한 Series를 얻을 수도 있다.

DataFrame에 대해서는 duplicate 함수를 적용할 수 있다. Series의 경우와 마찬가지로 각 데이터(행)의 중복 여부를 판별하여 boolean Series로 반환한다.

특잇값 다루기

DataFrame 혹은 Series 각 데이터가 Nan인지 여부를 TrueFalse로 반환한다. 이를 응용하면 다음과 같이 각 column의 특잇값 수를 구할 수 있다.

df.isnull().sum()

데이터 연산

Pandas에서는 SeriesDataFrame를 피연산자로 하는 연산이 가능하다.

크기가 맞지 않는 데이터는 어떻게 할까? 연산이 가능하기는 하지만, 두 데이터 모두에 존재하지 않는 index나 column은 NaN으로 반환한다. 이는 연산 함수의 fill_value 인자로 바꿀 수 있다.

DataFrame의 경우 기준이 되는 axis(기본값 1 혹은 'columns')를 지정할 수 있다.

자세한 내용은 공식 문서를 참고하자.

데이터 요약하기

수치 데이터 타입의 Series를 대상으로 sum, mean, min, max, count, median 등 통계 함수를 적용할 수 있다.

DataFrame에서는 apply를 이용해 column별 데이터를 요약하거나 descibe 함수를 통해 각 열에 대한 통계 요약을 볼 수 있다.

데이터 저장하기

여러 형식의 파일로부터 데이터를 불러왔듯이, 다른 형식의 파일로 데이터를 저장할 수 있다. 그 방법은 다음과 같은데, 불러오기에 비해 비교적 간단하다.

df.to_scv()

이 글은 부스트캠프 강의 내용을 재구성한 것입니다.

profile
섬마을 초보 개발자

0개의 댓글