Pandas 소개 2

GonsSu24 내용에 이어서 Pandas 라이브러리를 소개한다.

먼저 GongSu24를 임포트 한다.


In [1]:
from GongSu24_Pandas_Introduction_1 import *


/Users/gslee/anaconda/lib/python2.7/site-packages/pandas/core/indexing.py:179: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self._setitem_with_indexer(indexer, value)

색인(Index) 클래스

Pandas에 정의된 색인(Index) 클래스는 Series와 DataFrame 자료형의 행과 열을 구분하는 이름들의 목록을 저장하는 데에 사용된다.

Series 객체에서 사용되는 Index 객체

  • index 속성

아래와 같이 Series 객체를 생성한 후에 index를 확인해보자.


In [2]:
s6 = Series(range(3), index=['a', 'b', 'c'])
s6


Out[2]:
a    0
b    1
c    2
dtype: int64

index의 자료형이 Index 클래스의 객체임을 확인할 수 있다.


In [3]:
s6_index = s6.index
s6_index


Out[3]:
Index([u'a', u'b', u'c'], dtype='object')

Index 객체에 대해 인덱싱과 슬라이싱을 리스트의 경우처럼 활용할 수 있다.


In [4]:
s6_index[2]


Out[4]:
'c'

In [5]:
s6_index[1:]


Out[5]:
Index([u'b', u'c'], dtype='object')

Index 객체는 불변(immutable) 자료형이다.


In [6]:
s6_index[1] = 'd'


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-e3993afabe03> in <module>()
----> 1 s6_index[1] = 'd'

/Users/gslee/anaconda/lib/python2.7/site-packages/pandas/core/indexes/base.pyc in __setitem__(self, key, value)
   1618 
   1619     def __setitem__(self, key, value):
-> 1620         raise TypeError("Index does not support mutable operations")
   1621 
   1622     def __getitem__(self, key):

TypeError: Index does not support mutable operations

색인 객체는 변경될 수 없기에 자료 구조 사이에서 안전하게 공유될 수 있다.


In [7]:
an_index = pd.Index(np.arange(3))
an_index


Out[7]:
Int64Index([0, 1, 2], dtype='int64')

앞서 선언된 an_index를 새로운 Series 나 DataFrame 을 생성하는 데에 사용할 수 있으며, 사용된 index가 무엇인지를 확인할 수도 있다.


In [8]:
s7= Series([1.5, -2.5, 0], index=an_index)
s7.index is an_index


Out[8]:
True

DataFrame 객체에서 사용되는 Index 객체

  • index 속성
  • columns 속성

In [9]:
df3


Out[9]:
pop state year
one 1.5 Ohio 2000
two 1.7 Ohio 2001
three 3.6 Ohio 2002
four 2.4 Nevada 2001
five 2.9 Nevada 2002

columns와 index 속성 모두 Index 객체이다.


In [10]:
df3.columns


Out[10]:
Index([u'pop', u'state', u'year'], dtype='object')

In [11]:
df3.index


Out[11]:
Index([u'one', u'two', u'three', u'four', u'five'], dtype='object')

In [12]:
df3.columns[:2]


Out[12]:
Index([u'pop', u'state'], dtype='object')

in 연산자 활용하기

in 연산자를 활용하여 index 와 columns에 사용된 행과 열의 이름의 존재여부를 확인할 수 있다.


In [13]:
'debt' in df3.columns


Out[13]:
False

In [14]:
'four' in df3.index


Out[14]:
True

각각의 색인은 담고 있는 데이터에 대한 정보를 취급하는 여러 가지 메서드와 속성을 가지고 있다. [표 5-3]을 참고하자.

Series와 DataFrame 관련 연산 및 주요 메소드

Series나 DataFrame 형식으로 저장된 데이터를 다루는 주요 연산 및 기능을 설명한다.

재색인(reindex) 메소드

reindex() 메소드는 지정된 색인을 사용해서 새로운 Series나 DataFrame 객체를 생성한다.

Series의 경우 재색인


In [15]:
s8 = Series([4.3, 9.2, 8.1, 3.9], index= ['b', 'c', 'a', 'd'])
s8


Out[15]:
b    4.3
c    9.2
a    8.1
d    3.9
dtype: float64

reindex() 메소드를 이용하여 인덱스를 새로 지정할 수 있다.

주의: 새로 사용되는 항목이 index에 추가되면 NaN이 값으로 사용된다.


In [16]:
s9 = s8.reindex(['a', 'b', 'c', 'd', 'e', 'f'])
s9


Out[16]:
a    8.1
b    4.3
c    9.2
d    3.9
e    NaN
f    NaN
dtype: float64

누락된 값을 지정된 값으로 채울 수도 있다.


In [17]:
s8.reindex(['a','b','c','d','e', 'f'], fill_value=0.0)


Out[17]:
a    8.1
b    4.3
c    9.2
d    3.9
e    0.0
f    0.0
dtype: float64

method 옵션

시계열(time series) 등과 데이터 처럼 어떠 순서에 따라 정렬된 데이터를 재색인할 때 보간법을 이용하여 누락된 값들을 채워 넣어야 하는 경우가 있다. 이런 경우 method 옵션을 이용하며, ffill, bfill, nearest 등을 옵션값으로 활용한다.


In [18]:
s9 = Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
s9


Out[18]:
0      blue
2    purple
4    yellow
dtype: object

In [19]:
s9.reindex(range(6))


Out[19]:
0      blue
1       NaN
2    purple
3       NaN
4    yellow
5       NaN
dtype: object

In [20]:
s9.reindex(range(6), method='ffill')


Out[20]:
0      blue
1      blue
2    purple
3    purple
4    yellow
5    yellow
dtype: object

In [21]:
s9.reindex(range(6), method='bfill')


Out[21]:
0      blue
1    purple
2    purple
3    yellow
4    yellow
5       NaN
dtype: object

In [22]:
s9.reindex(range(6), method='nearest')


Out[22]:
0      blue
1    purple
2    purple
3    yellow
4    yellow
5    yellow
dtype: object

DataFrame의 경우 재색인

행과 열에 대해 모두 사용이 가능하다.


In [23]:
data = np.arange(9).reshape(3, 3)
data


Out[23]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [24]:
df6 = DataFrame(data, index=['a', 'b', 'd'], columns= ['Ohio', 'Texas', 'California'])
df6


Out[24]:
Ohio Texas California
a 0 1 2
b 3 4 5
d 6 7 8
  • index 속성의 재색인은 Series의 경우와 동일하다.

In [25]:
df7 = df6.reindex(['a', 'b', 'c', 'd'])
df7


Out[25]:
Ohio Texas California
a 0.0 1.0 2.0
b 3.0 4.0 5.0
c NaN NaN NaN
d 6.0 7.0 8.0
  • columns 속성의 재색인은 키워드(예약어)를 사용한다.

In [26]:
states = ['Texas', 'Utah', 'California']
df6.reindex(columns=states)


Out[26]:
Texas Utah California
a 1 NaN 2
b 4 NaN 5
d 7 NaN 8
  • method 옵션을 이용한 보간은 행 대해서만 이루어진다.

In [27]:
df6.reindex(index=['a', 'b', 'c', 'd'], method='ffill')


Out[27]:
Ohio Texas California
a 0 1 2
b 3 4 5
c 3 4 5
d 6 7 8

In [28]:
df6.reindex(index=['a', 'b', 'c', 'd'], method='bfill')


Out[28]:
Ohio Texas California
a 0 1 2
b 3 4 5
c 6 7 8
d 6 7 8

In [29]:
df6.reindex(index=['a', 2, 3, 4])


Out[29]:
Ohio Texas California
a 0.0 1.0 2.0
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN

method='nearest'는 인덱스가 모두 숫자인 경우에만 적용할 수 있다.


In [30]:
df6.reindex(index=['a', 'b', 'c', 'd'], method='nearest')


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-30-0da7248ac167> in <module>()
----> 1 df6.reindex(index=['a', 'b', 'c', 'd'], method='nearest')

/Users/gslee/anaconda/lib/python2.7/site-packages/pandas/core/frame.pyc in reindex(self, index, columns, **kwargs)
   2829     def reindex(self, index=None, columns=None, **kwargs):
   2830         return super(DataFrame, self).reindex(index=index, columns=columns,
-> 2831                                               **kwargs)
   2832 
   2833     @Appender(_shared_docs['reindex_axis'] % _shared_doc_kwargs)

/Users/gslee/anaconda/lib/python2.7/site-packages/pandas/core/generic.pyc in reindex(self, *args, **kwargs)
   2402         # perform the reindex on the axes
   2403         return self._reindex_axes(axes, level, limit, tolerance, method,
-> 2404                                   fill_value, copy).__finalize__(self)
   2405 
   2406     def _reindex_axes(self, axes, level, limit, tolerance, method, fill_value,

/Users/gslee/anaconda/lib/python2.7/site-packages/pandas/core/frame.pyc in _reindex_axes(self, axes, level, limit, tolerance, method, fill_value, copy)
   2775         if index is not None:
   2776             frame = frame._reindex_index(index, method, copy, level,
-> 2777                                          fill_value, limit, tolerance)
   2778 
   2779         return frame

/Users/gslee/anaconda/lib/python2.7/site-packages/pandas/core/frame.pyc in _reindex_index(self, new_index, method, copy, level, fill_value, limit, tolerance)
   2783         new_index, indexer = self.index.reindex(new_index, method=method,
   2784                                                 level=level, limit=limit,
-> 2785                                                 tolerance=tolerance)
   2786         return self._reindex_with_indexers({0: [new_index, indexer]},
   2787                                            copy=copy, fill_value=fill_value,

/Users/gslee/anaconda/lib/python2.7/site-packages/pandas/core/indexes/base.pyc in reindex(self, target, method, level, limit, tolerance)
   2831                     indexer = self.get_indexer(target, method=method,
   2832                                                limit=limit,
-> 2833                                                tolerance=tolerance)
   2834                 else:
   2835                     if method is not None or limit is not None:

/Users/gslee/anaconda/lib/python2.7/site-packages/pandas/core/indexes/base.pyc in get_indexer(self, target, method, limit, tolerance)
   2538             indexer = self._get_fill_indexer(target, method, limit, tolerance)
   2539         elif method == 'nearest':
-> 2540             indexer = self._get_nearest_indexer(target, limit, tolerance)
   2541         else:
   2542             if tolerance is not None:

/Users/gslee/anaconda/lib/python2.7/site-packages/pandas/core/indexes/base.pyc in _get_nearest_indexer(self, target, limit, tolerance)
   2608 
   2609         target = np.asarray(target)
-> 2610         left_distances = abs(self.values[left_indexer] - target)
   2611         right_distances = abs(self.values[right_indexer] - target)
   2612 

TypeError: unsupported operand type(s) for -: 'str' and 'str'

주의

reindex는 기존 자료를 변경하지 않는다.


In [31]:
df6


Out[31]:
Ohio Texas California
a 0 1 2
b 3 4 5
d 6 7 8

loc 메소드를 이용한 재색인

loc 메소드를 이용하여 재색인이 가능하다.


In [32]:
states


Out[32]:
['Texas', 'Utah', 'California']

In [33]:
df6.loc[['a', 'b', 'c', 'd'], states]


Out[33]:
Texas Utah California
a 1.0 NaN 2.0
b 4.0 NaN 5.0
c NaN NaN NaN
d 7.0 NaN 8.0