Pandas
가 무엇일까?Pandas
는 파이썬에서 구조화된 데이터를 보다 쉽고 빠르게 처리할 수 있도록 도와준다.
Pandas
는 주로 numpy
와 함께 결합하여 데이터 처리 및 통계 분석 등에서 강력한 기능을 제공함으로써 파이썬 데이터 처리의 '표준'으로 빠르게 자리잡아 왔다.
파이썬의 장점 중 하나는 다양한 라이브러리를 사용할 수 있다는 점이다. 그런데 여러 프로젝트를 하나의 환경에서 개발하다 보면, 라이브러리 사이의 상호 의존성으로 인한 충돌이 발생할 수 있다.
이러한 문제를 해결하기 위해 '가상환경'을 설정하는 것이 좋다. 여기서는 conda
를 이용해 가상환경을 생성하고 실행하도록 한다.
conda create -n ml python ## 'ml' 가상환경 생성
conda activate ml # 'ml' 가상환경 실행
conda install pandas # 가상환경에 pandas 설치
설치를 마치면, 아래와 같이 pandas
를 import 할 수 있다. pandas
는 관례적으로 pd
로 나타낸다. (DataFrame
은 df
변수에 담는 경우가 많다. 이 글에서도 이러한 관례를 따르기로 한다.)
import pandas as pd
Pandas
에서 데이터 테이블 전체를 포함하는 객체를 DataFrame
이라고 부른다. 데이터프레임은 한 개 이상의 열(column)으로 이루어지는데, 각 열은 pandas
에서 벡터를 표현하는 방식인 Series
객체로 이루어져 있다. 행렬을 각각의 행백터가 모여있는 것으로 생각하는 것과 비슷하다.
Numpy
의 array
와 같이 Series
는 하나의 데이터 타입만을 가질 수 있지만, 하나의 DataFrame
에 포함된 서로 다른 열은 서로 다른 데이터 타입을 가질 수 있다.
Series
와 DataFrame
은 모두 인덱스(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
의 일부를 출력해 데이터 구조를 파악할 수 있다.
loc
과 iloc
을 이용하여 인덱싱(indexing)을 할 수 있다. loc
과 iloc
의 차이는pandas
의 DataFrame
을 커스터마이징 할 수 있다는 점에서 비롯된다.
즉, 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
와 같이 처음 두 개의 데이터를 불러온다.
Pandas
는 Series
전체에 대한 비교 연산을 지원한다. 데이터 타입에 적절한 연산이라면, 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이다. 즉, 아무것도 지정하지 않는다면 행을 삭제하라는 의미인 것이다.
행을 삭제할 때는 인덱스 이름(위치가 아니다 - loc
과 iloc
의 차이를 기억하자)을 이용한다.
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
는 중복값 여부를 판별하여 Series
를 True
나 False
로 나타낸다. duplicated
와 boolean index의 조합으로 중복값을 추출할 수 있으며, (unique
함수와 같이) 중복값을 제외한 Series
를 얻을 수도 있다.
DataFrame
에 대해서는 duplicate
함수를 적용할 수 있다. Series
의 경우와 마찬가지로 각 데이터(행)의 중복 여부를 판별하여 boolean Series
로 반환한다.
DataFrame
혹은 Series
각 데이터가 Nan
인지 여부를 True
나 False
로 반환한다. 이를 응용하면 다음과 같이 각 column의 특잇값 수를 구할 수 있다.
df.isnull().sum()
Pandas
에서는 Series
와 DataFrame
를 피연산자로 하는 연산이 가능하다.
크기가 맞지 않는 데이터는 어떻게 할까? 연산이 가능하기는 하지만, 두 데이터 모두에 존재하지 않는 index나 column은 NaN으로 반환한다. 이는 연산 함수의 fill_value
인자로 바꿀 수 있다.
DataFrame
의 경우 기준이 되는 axis
(기본값 1 혹은 'columns'
)를 지정할 수 있다.
자세한 내용은 공식 문서를 참고하자.
수치 데이터 타입의 Series
를 대상으로 sum
, mean
, min
, max
, count
, median
등 통계 함수를 적용할 수 있다.
DataFrame
에서는 apply
를 이용해 column별 데이터를 요약하거나 descibe
함수를 통해 각 열에 대한 통계 요약을 볼 수 있다.
여러 형식의 파일로부터 데이터를 불러왔듯이, 다른 형식의 파일로 데이터를 저장할 수 있다. 그 방법은 다음과 같은데, 불러오기에 비해 비교적 간단하다.
df.to_scv()
이 글은 부스트캠프 강의 내용을 재구성한 것입니다.