본문 바로가기
Data Science/파이썬으로 데이터분석 하기

파이썬으로 데이터분석하자 (4) - Pandas 기본

by 싸코 2017. 12. 6.

파이썬 Numpy  - 파이썬 라이브러리를 활용한 데이터 분석 中

※본 포스팅은 "파이썬 라이브러리를 활용한 데이터 분석"을 다시 돌아볼 목적으로 필요 내용만 간단하게 정리하였습니다.


2017/09/19 - [Data Science/Python] - 파이썬으로 데이터 분석하자 (1)

2017/09/27 - [Data Science/Python] - 파이썬으로 데이터 분석하자 (2) - IPython 사용하기

2017/10/09 - [Data Science/Python] - 파이썬으로 데이터 분석하자 (3) - NumPy 기본



Pandas 기본


우리가 가장 많이 접하는 데이터는 대부분 엑셀의 스프레드시트 형태일 것이다. 나 같은 문과생들은 행과 열로 되어 있는 자료구조에는 비교적 익숙하다. 나와 비슷했던 독자들에게는 파이썬에서 다룰 수 있는 엑셀이라고 생각하면 비교적 수월하게 학습이 가능하지 않을까 생각한다. R을 많이 사용해본 독자들에게 Pandas의 Dataframe은 낯설지 않을 것이다. SQL을 아는 사람들에게도 비교적 쉽게 다가올 것 같다.


Pandas는 웨스 맥키니가 투자 운용 회사인 AQR에 재직중이던 2008년 초에 개발하였고 현재 파이썬으로 데이터 과학을 하기 위해서 없어서는 안될 도구가 되었다. NumPy를 기반으로 개발되었다.


Pandas는 다음과 같은 기능을 위해서 만들어졌다고 한다.


  • 축의 이름을 따라 데이터를 정렬할 수 있는 자료 구조(data structure). 다양한 소스에서 가져온 다양한 방식으로 색인된 데이터를 핸들링 가능한 기능

  • 통합된 시계열 기능

  • 시계열, 비시계열 데이터 모두 다룰 수 있는 자료 구조

  • 산술연산 및 한 축(column을 의미하는 듯)의 모든 값을 더하는 등의 축약연산이 가능

  • 누락된 데이터의 유연한 처리 기능

  • SQL 같은 관계연산 수행 기능



1. Pandas 자료구조

1) Series

2) DataFrame

3) Index Object



2. Essential Application

1) 재색인

2) 행, 열 삭제

3) 색인, 슬라이싱, 조건

4) 산술연산

5) 함수적용 apply

6) 정렬, 순위

7) 중복 색인



3. 기술통계

1) 상관관계, 공분산

2) 유일 값, 값 세기, 멤버십



4. NA 데이터 처리


5. 계층적 색인



>> from pandas import Series, DataFrame

>> import pandas as pd

>> import numpy as np


위 3가지는 관습처럼 사용하는 것이므로 그대로 따라서 하는 것이 좋다.



1. Pandas 자료구조

Pandas는 Series, DataFrame 두 자료구조가 가장 중요하다.

1) Series

1차원 배열 같은 구조이다. 엑셀로 보면 복수의 행(row)으로 이루어진 하나의 열(column) 또는 복수의 열(column)으로 이루어진 하나 행(row)의 값들이라고 생각하면 된다.
그리고 엑셀의 column들이 그렇듯 색인(index)을 가지고 있어 데이터를 지칭하는 이름을 가지고 있다.

In [7]: obj = Series([4, 7, -5, 3])


In [8]: obj

Out[9]:

0    4

1    7

2   -5

3    3

dtype: int64


위에서 볼 수 있듯이 왼쪽은 행의 index, 오른쪽에는 해당 색인의 값을 보여준다. 기본적으로 정수 0부터 시작해서 색인이 표시된다.


주요 메서드


Series.values

해당 시리즈 객체의 값들만 반환한다


Series.index

해당 시리즈의 색인(index)만 반환한다


Series( 배열, index = 지정하고 싶은 index list )

Series 객체를 생성할 때 색인을 미리 지정할 수 있다. 색인 리스트는 보통 색인의 값을 따로 저장을 주로 해놓는다.

ex) >> index_list = ['a', 'b', 'c', 'd']

     >> a = Series(data, index= index_list)


Series[ index  ]

배열에서 값을 선택하거나 대입할 때는 색인을 이용한다. 이는 파이썬의 일반적인 자료 접근 방식과 유사하다.


Series[ conditions ]

conditions에는 논리연산이 올 수 있다. a라는 Series가 있다고 했을 때, a[ a>0 ]은 a라는 Series에서 값이 0 이상인 것만 반환하라는 의미이다.  conditions는 파이썬에서 사용하는 conditions는 모두 올 수 있다.

비슷하게 NumPy에서 벡터 연산을 한 것처럼 Series도 비슷하게 산술연산을 하거나 수학 함수를 적용할 수 있다. 물론 각 값에 해당 연산이 수행된다. NumPy 배열 연산을 Pandas 자료구조에도 적용할 수 있다. ex) a*2,   np.exp(a)


Dictionary to Series

파이썬 사전 객체를 Series 객체로 생성할 수도 있음

{'색인' : 값, '색인': 값, .... }


Series.isnull()

pd.isnull(object)

pd.notnull(object)

누락된 데이터가 있는지 없는지 확인할 때 사용함. Series에서는 메소드로 기능 제공


Series는 산술연산도 가능하며

Series의 색인은 모두 name  속성이 있음

object.name = '@@@'    // Series에 대한 이름

object.index.name = '@@@'   // index(색인)에 대한 이름




2) DataFrame

하나의 열이 여러개가 모이면 우리가 잘 아는 엑셀의 스프레드시트 형태라고 볼 수 있다. DataFrame은 이러한 스프레드시트의 형식의 자료구조를 가진다. 각 열(column)에서는 서로 다른 종류의 값(숫자, 문자열, 불리언 등)을 가질 수 있다. Series가 복수개 합쳐진 것이라고 보면 된다. 하나의 Series는 동일한 자료형을 가지는 것을 기억할 필요가 있다.

DataFrame도 Series 처럼 파이썬 사전 객체로 생성할 수 있는데 다음과 같이 할 수 있다.

>> data = { 'name' : ['철수', '영희', '숙자', '길동'],
                'age' : [23, 30, 31, 42],
                'score' : [91.3, 83.4, 77.5, 87.7] }
>> frame = DataFrame(data)


Series와 동일하게 data에 없는 값 색인이나 column으로 넘기면 NaN 값이 저장된다.



주요 메서드


DataFrame( data, columns = column_list, index = index_list )


DataFramecolumn_name ] , DataFrame.column_name

데이터프레임은 사전처럼 색인으로 컬럼에 접근('[ ]')할 수 있고 속성(attribute)로 접근하는 방법('.')으로도 열(column)을 불러올 수 있다.
column에도 값을 대입할 수 있다. Series와 동일한 방식이다.

ex) df['a'] = 0   #a라는 열column의 값은 모두 0으로 대입

   

배열의 값도 대입할 수 있다.

ex) df['b'] = np.arange(5.)

리스트나 

list나 array의 값을 열(column)에 대입할 때는 대입하려는 값의 길이가 DataFrame의 크기와 같아야 한다.


없는 컬럼을 대입하면 새로운 컬럼이 생성된다


Dataframe[column] = statement

데이터프레임의 컬럼에 직접 value나 statement를 입력하여서 컬럼에 값을 대입할 수 있다

리스트나 배열을 칼럼에 대입할 때는 대입하려는 값의 길이가 DataFrame의 크기와 같아야 한다. Series를 대입하면 색인에 따라 값이 대입되고 색인이 없는 것에는 대입되지 않음

ex1. df['col1'] = 16.5

ex2. df['col2'] = np.arange(5.)

ex3. df['col3'] = df.name == 'Olleh'   // 논리연산으로 반환되는 배열도 가능


del DataFrame['column_name']

파이썬 예약어 del을 사용해서 파이썬 사전형에서처럼 데이터프레임의 열(column)을 삭제할 수 있다.


Nested Dictionaries to DataFrame

중첩된 사전 형태의 자료구조로도 데이터프레임을 생성할 수 있다.

ex) >> data =  { 'a' : { 'b' : 1 } }

     >> DataFrame(data)

위와 같은 경우는 column이 'a' 이고 row의 색인이 'b'인 데이터 프레임이 만들어진다.

  

중첩된 경우라고 할지라도 DataFrame(data, index = 인덱스리스트) 인덱스리스트에 색인을 집어넣으면 지정된 색인으로 DataFrame이 생성된다.


DataFrame.T

행과 열을 뒤집어 버리는 것이다. NumPy에서처럼 동일하게 동작한다. 2행 3열이면 3행 2열로 바뀌며 색인의 위치도 변경된다.


DataFrame.values

Series와 동일하게 값들을 다차원 배열로 반환한다


DataFrame.index

마찬가지로 Series와 동일하다.


DataFrame.columns

데이터프레임에 있는 모든 열을 인덱스 배열로 반환하다



DataFrame 생성자에서 입력 가능한 데이터


Type

Contents 

2차원 ndarray 

데이터를 담고 있는 행렬. 행과 열을 선택해서 데이터프레임으로 만들 수 있음

배열, 리스트, 사전 

사전의 모든 항목은 같은 길이를 가져야 함. key 값이 컬럼이 됨 

NumPy 배열 

배열의 사전과 같은 방식으로 됨 

Series 사전 

Series의 각 값이 컬럼이 됨. 명시적으로 색인을 넘겨쥦 않으면 각 Series의 색인이 하나로 합쳐져 행이 됨 

사전의 사전 

가장 외부에 있는 key가 컬럼이 되고 내부 사전의 key가 색인이 됨 

사전이나 Series 리스트 

리스트의 각 항목이 데이터프레임의 로우가 됨. 

리스트나 튜플의 리스트 

2차원 ndarray와 동일 

다른 DataFrame 

색인을 따로 지정하지 않으면 이전 데이터프레임 색인과 동일 

NumPy MaskedArray 

'2차원 ndarray'와 같은 방식이지만 마스크 값은 반환되는 DataFrame에서 NA 값이 됨 





3) Index Object

pandas의 색인 객체는 각 행과 열에 대한 이름과 다른 meta data를 저장하는 객체임.

색인 객체는 변경할 수 없어 안전하게 공유가능


pandas에는 내장 색인 클래스가 정리되어 있어 특수한 목적으로 축을 색인하는 기능을 개발하기 위해서 Index 클래스의 Sub클래스를 만들수 있음

Index 클래스

Index 클래스는 일반적인 색인 객체이며 NumPy 배열 형식으로 축의 이름을 표현
Int64Index 클래스는 정수 값을 위한 색인 객체
MultiIndex 단일 축에 여러 단계의 색인을 표현하는 계층적 색인 객체. 튜플의 배열과 유사
DatetimeIndex 나노초 타임스탬프를 저장함 datetime64 dtype
PeriodIndex 기간데이터를 위한 특수한 Index



주요 메서드

메서드 내용은 대체로 비슷한 듯 함. pandas 객체는...

Index.append
추가적인 Index 객체를 덧붙여 새로운 색인 반환

Index.diff
색인의 차집합을 반환

Index.intersection
색인의 교집합을 반환

Index.union
색인의 합집합을 반환

Index.isin
넘겨 받은 값이 해당 색인 위치에 존재하는지 알려주는 불리언 배열을 반환

Index.delete
i 위치의 색인이 삭제된 새로운 색인을 반환

Index.drop
넘겨받은 값이 삭제된 새로운 색인을 반환

Index.insert
i 위치에 값이 추가된 새로운 색인을 반환

Index.is_monotonic
색인이 단조성을 가진다면 True를 반환

Index.is_unique
중복되는 색인이 없다면 True를 반환

Index.unique
색인에서 유일한 값만을 반환






2. Essential Application

pandas에는 수많은 기능이 있지만 

1) 재색인

Series.reindex( [index list , fill_ value = value)
데이터를 새로운 색인에 맞게 재배열, 없는 색인 값이 있다면 비어있는 값을 새로 추가
method 옵션을 사용하면 시계열 데이터를 재색인할 때 값을 채워넣을 수 있음
reindex method 옵션
 - ffill 또는 pad : 앞의 값으로 채워 넣음
 - bfill 또는 backfill : 뒤의 값으로 채워 넣음

In [3]: obj = Series(['a','b','c'], index=[0,2,4])

In [4]: obj
Out[4]:
0    a
2    b
4    c
dtype: object

In [5]: obj.reindex(range(6), method='ffill')
Out[5]:
0    a
1    a
2    b
3    b
4    c
5    c
dtype: object


columns을 사용해서 reindex 가능

- df.reindex(columns = ['a','b','c'] )


재색인 함수 인자

- index : 색인으로 사용할 새로운 순서. 순차적인 자료구조 사용가능(list, array...)

- method

- fill_value : 재색인 과정 중 발생하는 비어있는 데이터를 채우기 위한 값

- level : MultiIndex 단계에 단순 색인을 맞춤

- copy : True인 경우 새로운색인이 이전과 색인이 같더라도 데이터를 복사. False라면 두 색인이 같을 경우 데이터 복사 안됨




2) 하나의 행 또는 열 삭제

DataFrame.drop( list , axis=0/1)

drop하고자 하는 행의 색인, 열의 이름을 값이나 리스트로 입력하며 axis =1 일 경우 열을 drop하는 것으로 함 default는 행(0)임




3) 색인하기(indexing), 선택하기(slicing), 거르기(conditioning)

Series의 색인은 NumPy 배열의 색인과 유사하게 동작하는데, Series의 색인은 정수가 아니어도 된다는 점이 다름

obj[[1,3]]

obj[obj<3]


시작점과 끝점을 포함한다는 점에서 파이썬 슬라이싱과 다름

obj[1:3]

파이썬에서는 3을 포함하지 않으나 pandas에서는 포함함

obj[1:3] = 3 // 색인 1,2,3에 값 3 대입됨


열은 list를 넣음으로써 색인방식( [ ] )으로 선택하기가 가능하고

행은 일반적인 슬라이싱( : )으로 선택하기로도 가능함. 불리언 배열로 컬럼을 선택할 수도 있음

data[data['age'] > 10]



DataFrame.ix[ rows , columns ]

축의 라벨을 사용해서 데이터프레임의 행과 열을 선택할 수 있음

data.ix[1:2, 'age']    //data 1번,2번 행에서 age만 꺼내옴



방법 

내용 

 df[val] 

 데이터프레임에서 하나의 칼럼 또는 열을 선택. 편의를 위해 불리 언 배열, 슬라이스, 불리언 데이터프레임을 사용할 수 있음

 df.ix[val]

 데이터프레임에서 행의 부분집합을 선택 

 df.ix[:, val] 

 데이터프레임에서 열의 부분집합을 선택 

 df.ix[val1, val2] 

 데이터프레임에서 행또는 열의 

 reindex method

 하나 이상의 축을 새로운 색인으로 맞춘다 

 xs method 

 라벨 이름으로 단일 행이나 열을 Series 형식으로 선택 

 icol, irow method 

 정수 색인으로 단일 행이나 열을 선택 

 get_value, set_value method 

 행과 열의 이름으로 데이터프레임의 값을 선택



4) 산술연산, 데이터 정렬

색인이 다른 두 객체간의 산술연산이 가능

SeriesA + SeriesB

겹치는 색인이 없을 때는 데이터는 NA 값이 됨
겹치는 색인이 없을 때 NA 값이 아니라 그대로 있는 값만 반환하고 싶다면, fill_value 파라미터에 값을 0으로 주면 된다
df1.add(df2, fill_value=0)


 메서드 

 설명 

 add 

 덧셈(+) 

 sub 

 뺄셈(-) 

 div 

 나눗셈(/) 

 mul 

 곱셈(*) 



데이터프레임과 시리즈 간의 연산도 가능



5) 함수 적용, 매핑

NumPy에도 유니버설 함수(배열의 각 원소에 적용되는 메서드) 적용이 가능하다

f = lambda x: x.max() - x.min()

frame.apply( f, axis=1 )

배열의 각 원소에 적용되는 함수
frame.applymap(lambda x: '%.2f' % x)




6) 정렬, 순위

df.sort_index()

df.sort_values( by=col_list )
시리즈를 정렬할 때는 전달인자가 필요 없음
데이터 프레임에서는 정렬 기준이 되는 열의 이름이나 열 리스트를 전달
열 리스트를 전달할 때는 정렬 우선순위에 따라 리스트를 전달해야 함



7) 중복 색인

색인 값이 중복이 올 수 있음






3. 기술통계

Pandas에는 요약통계를 할 수 있는 기본적인 메서드를 제공하며, 누락된 데이터를 제외하고 요약통계를 작성할 수 있는 옵션이 제공됨

df.sum()
axis = 1        각 행의 합을 반환
skipna=True   NA 값을 제외하고 계산
level             계산하려는 축이 계층적 색인이라면 레벨에 따라 묶어서 계산

df.cumsum()
누적합

df.describe()
한 번에 요약된 통계 결과를 반환


< 기술통계와 요약통계를 위한 메서드 >

메서드 

설명 

 count

 NA 값을 제외한 값의 수를 반환 

 describe 

 시리즈 혹은 데이터프레임의 각 열에 대한 요약 통계 

 min, max

 최소, 최대값 

 argmin, argmax 

 최소, 최대값을 갖고 있는 색인 위치 반환 

 idxmin, idxmanx 

 최소 최대값 갖고 있는 색인의 값 반환 

 quantile 

 0부터 1까지의 분위수 계산 

 sum 

 합 

 mean 

 평균 

 median 

 중위값 

 mad

 평균값에서 절대 평균편차 

 var 

 표본 분산 

 std 

 표본 정규분산 

 skew 

 표본 비대칭도 

 kurt 

 표본 첨도 

 cumsum 

 누적 합 

 cummin, cummax 

 누적 최소값, 누적 최대값 

 cumprod 

 누적 곱 

 diff 

 1차 산술차 (시계열 데이터 사용시 유용) 

 pct_change 

 퍼센트 변화율 계산 



pct_change를 사용하면 주가 예측을 위한 데이터 전처리에서 전일 또는 어떤 기간에서의 변화율을 퍼센트로 쉽게 계산할 수 있음

1) 상관관계, 공분산

df.corr()
데이터프레임의 모든 변수 간 상관관계 계산하여 반환

df.col1.corr(df.col2)
df에서 col1과 col2의 상관관계 계산하여 반환

df.cov()
데이터프레임의 모든 변수 간 공분산을 계산하여 반환

df.corrwith(df.col)
다른 시리즈나 데이터프레임과의 상관관계를 계산
ex.  df.corrwith(df.age)
하나의 변수와 나머지 변수 간의 상관관계를 볼 때 좋음



2) 유일 값, 값 세기, 멤버십

Series.unique()
시리즈의 중복 값 제거하고 유일한 값만 반환

Series.value_counts()
시리즈에서 유일한 값들의 수를 합산(count)하여 반환
sort  정렬에 대한 옵션으로 False로 하면 자동정렬을 중지 시킬 수 있음

df.apply(pd.value_counts).fillna(0)
위의 예는데이터프레임에 apply 함수에 value_counts 메서드를 넘긴 것. 모든 열에 value_counts가 실행됨

Series.is_in()
값이나 리스트를 전달하여서 시리즈내에 해당 리스트의 값들이 존재하는지 True, False로 반환
obj[obj.is_in('a')]
위의 예는 'a' 값만 obj 시리즈에서 골라서 반환




4. NA 데이터 처리

누락된 데이터 NaN(Not a Number)를 손 쉽게 찾아 처리할 수 있는 메서드가 있다

 메서드

설명 

 dropna

 누락된 데이터가 있는 축(행, 열)을 제외

 어느 정도의 누락 데이터까지 용인할 것인지 지정 가능 

 fillna 

 누락된 데이터를 대신할 값을 채우거나 'ffill', 'bfill' 같은 메서드 적용 가능 

 isnull

 누락되거나 NA인 값을 알려주는 불리언 값 객체 반환 

 notnull 

 isnull의 반대 




DataFrame.dropna()

how 옵션을 주면 조건을 설정할 수 있으며 'all'을 하면 모든 값이 nan인 것만 제외시킴 (ex. df.dropna(how='all') )

aixs 옵션을 주면 제외할 축을 선택할 수 있음

thresh 옵션을 주면 몇 개 이상의 값이 들어 있는지 선택해서 해당 행들만 볼 수 있음 (ex. df.dropna(thresh=2) ) 이 예제는 행에서 최소 2개 이상의 값이 있어야 함. 만약 열이 3개일 경우 [ 23, NaN, NaN ] 같은 행은 제외됨. [23, NaN, 17] 행은 반환됨



DataFrame.fillna()

inplace 옵션에 True를 주면 또 다른 객체를 반환하지 않고 기존 객체를 수정 (ex. df.fillna(inplace=True) )

ex. df.fillna(df.mean())

value  비어있는 값을 채울 값이나 사전 형식의 객체 전달

method  기본적으로 ffill 사용

axis  값을 채울 축

limit  값을 앞 혹은 뒤에서 몇개까지 채울지


df[df.notnull()]





5. 계층적 색인



향후 추가






















댓글