데이터 분석을 위한 Pandas의 기초

작성자 : 원민

1. Pandas

1-1. Series

import pandas as pd
from pandas import Series, DataFrame

pandas의 import 컨벤션은 위와같이 사용하고, Series와 DataFrame은 로컬 네임스페이스로 임포트 하는것이 훨씬 편하므로 위와같이 사용합니다.

  • Series Series는 일련의 개체를 담을 수 있는 1차원 배열 같은 자료구조입니다. 가장 간단한 Series 객체는 배열 데이터로부터 생성할 수 있습니다.
    obj = pd.Series([4, 7, -5, 3])
    obj
    
0  4
1  7
2  -5
3  3

Series 객체의 문자열 표현은 왼쪽에 색이능ㄹ 보여주고 오른쪽에 해당 색인의 값을 보여줍니다. 그리고 각각의 데이터를 지칭하는 색인을 지정하여 Series 객체를 생성해야 할때는 다음과 같이 합니다.

obj2 = pd.Series([4, 7, -5, 3], index=['d','b','a','c'])
obj2
d  4
b  7
a  -5
c  3

또한 불리언 배열을 사용해서 값을 걸러 내거나 산술 곱셈을 수행하거나 또는 수학 함수를 적용하는 등 Numpy 배열 연산을 수행해도 색인-값 연결이 유지됩니다.

obj2[obj2 > 0]
d  6
b  7
c  3

파이썬 사전형에 데이터를 저장해야 한다면 파이썬 사전 객체로부터 Series 객체를 생성할 수도 있습니다.

sdata = {'Ohio':35000, 'Texas':71000, 'Oregon':16000, 'Utah':5000}
obj3 = pd.Series(sdata)
Ohio    35000
Oregon  16000
Texas   71000
Utah     5000

사전 객체만 가지고 Series 객체를 생성하면 생성된 Series 객체의 색인에는 사전의 키값이 순서대로 들어갑니다. 색인을 직접 지정하고 싶다면 원하는 순서대로 색인을 직접 넘겨줄 수도 있습니다.

states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4.Series(sdata, index=states)
California      NaN
Ohio        35000.0
Oregon      16000.0
Texas       71000.0

이 예제를 보면 sdata에 있는 값중 3개만 확인할 수 있는데, ‘California’에 대한 값을 찾을 수 없기 때문에 NaN으로 표시되고 pandas에서는 누락된 값, 혹은 NA값으로 취급됩니다. Utah는 states에 포함되어 있지 않으므로 실행 결과에서 빠지게 됩니다. pandas의 isnull과 notnull 함수는 누락된 데이터를 찾을 때 사용됩니다.

pd.isnull(obj4)
California   True
Ohio        False
Oregon      False
Texas       False
pd.notnull(obj4)
California  False
Ohio         True
Oregon       True
Texas        True

Series 객체와 Series 색인은 모두 name 속성이 있는데 이 속성은 pandas의 핵심 기능과 밀접한 관련이 있습니다.

obj4.name = 'population'
obj4.index.name = 'state'
state
California       NaN
Ohio         35000.0
Oregon       16000.0
Texas        71000.0
Name: population, dtype: float64

1-2. DataFrame

DataFrame 객체는 다양한 방법으로 생성할 수 있지만 가장 흔하게 사용되는 방법은 같은 길이의 리스트에 담긴 사전을 이용하거나 Numpy 배열을 이용하는 것입니다.

data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada','Nevada'],
        'year':[2000, 2001, 2002, 2001, 2002, 2003],
        'pop':[1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
frame
   pop   state  year
0  1.5    Ohio  2000
1  1.7    Ohio  2001
2  3.6    Ohio  2002
3  2.4  Nevada  2001
4  2.9  Nevada  2002
5  3.2  Nevada  2003

큰 DataFrame을 다룰 때는 head 메서드를 이용해서 처음 5개의 로우만 출력할 수도 있습니다.

frame.head()
   pop   state  year
0  1.5    Ohio  2000
1  1.7    Ohio  2001
2  3.6    Ohio  2002
3  2.4  Nevada  2001
4  2.9  Nevada  2002

원하는 순서대로 columns를 지정하면 원하는 순서를 가진 DataFrame 객체가 생성됩니다.

pd.DataFrame(data, columns=['year', 'state', 'pop'])
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Nevada  2.4
4  2002  Nevada  2.9
5  2003  Nevada  3.2

Series와 마찬가지로 사전에 없는 값을 넘기면 결측치로 저장됩니다.

frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
                            index=['one','two','three','four','five','six'])
frame2
       year   state  pop  debt
one    2000    Ohio  1.5   NaN
two    2001    Ohio  1.7   NaN
three  2002    Ohio  3.6   NaN
four   2001  Nevada  2.4   NaN
five   2002  Nevada  2.9   NaN
six    2003  Nevada  3.2   NaN

반환된 Series 객체가 DataFrame과 같은 색인을 가지면 알맞은 값으로 name 속성이 채워집니다. 로우는 위치나 loc 속성을 이용해서 이름을 통해 접근할 수 있습니다.

frame2.loc['three']
year   2002
state  Ohio
pop    3.6
debt   NaN
Name: three, dtype: object

컬럼은 대입이 가능합니다. 예를 들어 현재 비어있는 ‘debt’ 컬럼에 스칼라값이나 배열의 값을 대입할 수 있습니다.

frame2['debt'] = np.arage(6.)
frame2
       year   state  pop  debt
one    2000    Ohio  1.5   0.0
two    2001    Ohio  1.7   1.0
three  2002    Ohio  3.6   2.0
four   2001  Nevada  2.4   3.0
five   2002  Nevada  2.9   4.0
six    2003  Nevada  3.2   5.0

존재하지 않는 컬럼을 대입하면 새로운 컬럼을 생성합니다. 파이썬 사전형에서처럼 del 예약어를 사용해서 컬럼을 삭제할 수 있습니다. del 예약어에 대한 예제로, state 컬럼의 값이 ‘Ohio’인지 아닌지에 대한 불리언값을 담고 있는 새로운 컬럼을 생성해봅시다.

frame2['eastern'] = frame2.state == 'Ohio'
frame2
       year   state  pop  debt  eastern
one    2000    Ohio  1.5   0.0     True
two    2001    Ohio  1.7   1.0     True
three  2002    Ohio  3.6   2.0     True
four   2001  Nevada  2.4   3.0    False
five   2002  Nevada  2.9   4.0    False
six    2003  Nevada  3.2   5.0    False

del 예약어를 이욯해서 이 컬럼을 삭제할 수 있습니다.

del frame2['eastern']
frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object)

중첩된 사전을 이용해서 데이터를 생성할 수 있습니다. 다음과 같은 중첩된 사전이 있습니다.

pop = {'Nevada':{2001:2.4, 2002:2.9},
       'Ohio':{2000:1.5, 2001:1.7, 2002:3.6}}
frame3 = pd.DataFrame(pop)
frame3
      Nevada  Ohio
2000     NaN   1.5
2001     2.4   1.7
2002     2.9   3.6

Numpy 배열과 유사한 문법으로 데이터를 전치할 수 있습니다.

frame3.T
        2000  2001  2002
Nevada   NaN   2.4   2.9
Ohio     1.5   1.7   3.6

1-3 색인 객체

Pandas의 색인 객체는 표 형식의 데이터에서 각 로우와 컬럼에 대한 이름과 다른 메타데이터를 저장하는 객체입니다. Series나 DataFrame 객체를 생성할 때 사용되는 배열이나 다른 순차적인 이름은 내부적으로 색인으로 변환됩니다.

obj = pd.Series(range(3), index=['a', 'b', 'c'])
index = obj.index
index
Index(['a', 'b', 'c'], dtype='object')

색인 객체는 변경이 불가능합니다. 그러므로 자료구조 사이에서 안전하게 공유될 수 있습니다.

labels = pd.Index(np.arange(3))
labels
Int64Index([0, 1, 2], dtype='int64')
obj2 = pd.Series([1.5, -2.5, 0], index=labels)
obj2
0   1.5
1  -2.5
2   0.0
dtype: float64
obj2.index is labels
True

또한 배열과 유사하게 Index 객체도 고정 크기로 동작합니다. 그리고 파이썬의 집합과는 달리 pandas의 인덱스는 중복되는 값을 허용합니다.

Categories:

Analytics