지난번 포스팅에서는 DataFrame 의 행과 열 기준으로 데이터 선택해서 가져오기 (indexing and selection)에 대해서 알아보았습니다.

 

index를 처음 만들기는 했는데요, 필요에 따라서 수정해야 할 필요가 생길 수도 있겠지요?

 

이번 포스팅에서는

 

 - (1) index 재설정하기 (reindex)

 

 - (2) reindex 과정에서 생기는 결측값 채우기
       (fill in missing values)

 

방법에 대해서 소개하겠습니다.

 

 

먼저, 필요한 library를 import 하고, dit와 index를 사용해서 간5행, 2열을 가진 간단한 DataFrame을 만들어보겠습니다.

 

 

##-- Make a new index and reindex the dataframe

 

In [1]: import numpy as np

   ...: import pandas as pd

   ...: from pandas import DataFrame

 

In [2]: idx = ['r0', 'r1', 'r2', 'r3', 'r4']

   ...:

   ...: df_1 = pd.DataFrame({

   ...: 'c1': np.arange(5),

   ...: 'c2': np.random.randn(5)},

   ...: index=idx)

 

In [3]: df_1

Out[3]:

    c1        c2
r0   0  1.182716
r1   1  0.244398
r2   2 -1.494202
r3   3  0.146152
r4   4 -0.352680

 

 

 

 

위 예에서 df_1 DataFrame의 행 index 가 ['r0', 'r1', 'r2', 'r3', 'r4'] 인데요, ['r3', 'r4']를 빼고 ['r5', 'r6']를 새로 추가하고 싶다고 해봅시다.  이때 사용하는 것이 'reindex' 입니다.

 

 

  (1-1) index 재설정하기 : reindex

 

 

##-- Make a new index and reindex the dataframe

 

In [4]: new_idx= ['r0', 'r1', 'r2', 'r5', 'r6']


In [5]: df_1.reindex(new_idx)

Out[5]:

     c1        c2
r0  0.0  1.182716
r1  1.0  0.244398
r2  2.0 -1.494202
r5  NaN       NaN
r6  NaN       NaN

 

 

이전에 없던 ['r5', 'r6'] index가 추가되자 'NaN' 값이 디폴트로 채워쳤습니다.  'NaN' 대신에 fill_value 파라미터를 사용해서 '0', 혹은 'missing', 'NA' 등으로 바꿔서 채워보겠습니다.

 

 

 

  (1-2) reindex 과정에서 생긴 결측값 채우기 (fill in missing values) : fill_value

 

 

##-- Fill in the missing values by passing a value to the keyword fill_value

 

In [8]: df_1.reindex(new_idx, fill_value=0)

Out[8]:

    c1        c2
r0   0  1.182716
r1   1  0.244398
r2   2 -1.494202
r5   0  0.000000
r6   0  0.000000

 

 

 

 

In [9]: df_1.reindex(new_idx, fill_value='missing')

Out[9]:

         c1        c2
r0        0   1.18272
r1        1  0.244398
r2        2   -1.4942
r5  missing   missing
r6  missing   missing

 

 

 

In [10]: df_1.reindex(new_idx, fill_value='NA')
Out[10]:

    c1        c2
r0   0   1.18272
r1   1  0.244398
r2   2   -1.4942
r5  NA        NA
r6  NA        NA

 

 

 


 

시계열 데이터 (TimeSeries Data)는 DataFrame의 index 만들 때 pd.date_range(date, periods, freq) 를 사용합니다. (시계열 데이터 처리, 분석은 나중에 따로 많이 포스팅하겠습니다.)

 

먼저, 시계열 데이터로 DataFrame 만들어보겠습니다.

 

 

In [11]: date_idx = pd.date_range('11/27/2016', periods=5, freq='D')


In [12]: date_idx

Out[12]:

DatetimeIndex(['2016-11-27', '2016-11-28', '2016-11-29', '2016-11-30',

'2016-12-01'],

dtype='datetime64[ns]', freq='D')


In [13]: df_2 = pd.DataFrame({"c1": [10, 20, 30, 40, 50]}, index=date_idx)


In [14]: df_2

Out[14]:

                c1

2016-11-27 10

2016-11-28 20

2016-11-29 30

2016-11-30 40

2016-12-01 50

 

 

 

 

위에서 만든 시계열 데이터 DataFrame 의 date 앞/뒤로 reindex 를 사용해서 날짜 몇 개를 새로 추가해보겠습니다.

 

  (2-1) 시계열 데이터 index 재설정 하기 (reindex of TimeSeries Data)

 

 

In [15]: date_idx_2 = pd.date_range('11/25/2016', periods=10, freq='D')


In [16]: df_2.reindex(date_idx_2)

Out[16]:

                 c1

2016-11-25 NaN

2016-11-26 NaN

2016-11-27 10.0

2016-11-28 20.0

2016-11-29 30.0

2016-11-30 40.0

2016-12-01 50.0

2016-12-02 NaN

2016-12-03 NaN

2016-12-04 NaN

 

 

 

 

  (2-2) 시계열 데이터 reindex 과정에서 생긴 결측값 채우기 : method='ffill', 'bfill'
         (fill in missing value of TimeSeries Data)

 

reindex 하면서 결측값을 채우는 방법으로 method='ffill'을 사용해서 결측값 직전의 값으로 이후 결측값을 채워보겠습니다.

 

 

In [17]: df_2.reindex(date_idx_2, method='ffill') # forward-propagation

Out[17]:

                   c1
2016-11-25   NaN
2016-11-26   NaN
2016-11-27  10.0
2016-11-28  20.0
2016-11-29  30.0
2016-11-30  40.0
2016-12-01  50.0
2016-12-02  50.0
2016-12-03  50.0
2016-12-04  50.0

 

 

 

 

이번에는 reindex 하면서 method='bfill' 을 사용해서 시간 뒷 순서의 결측값으로 이전 결측값을 채워보겠습니다.  

 

 

In [18]: df_2.reindex(date_idx_2, method='bfill') # back-propagation

Out[18]:

                  c1
2016-11-25  10.0
2016-11-26  10.0
2016-11-27  10.0
2016-11-28  20.0
2016-11-29  30.0
2016-11-30  40.0
2016-12-01  50.0
2016-12-02   NaN
2016-12-03   NaN
2016-12-04   NaN

 

 

많은 도움 되었기를 바랍니다.

 

728x90
반응형
Posted by Rfriend
,

이번 포스팅에서는 Python pandas에서 가장 중요하게 사용되는 Data 구조인

 

 - (1) DataFrame을 만들어보고,

 

 - (2) 다양한 Attributes 를 조회

 

하는 방법에 대해서 알아보겠습니다.

 

 

먼저 필요한 Library 들을 importing 하겠습니다.

 

 

In [1]: import numpy as np

   ...: import pandas as pd

   ...: from pandas import DataFrame as df

 

 

 

 

  (1) pandas DataFrame 만들기

 

pd.DataFrame() 에서 사용하는 Paraeter 들에는 (1) data, (2) index, (3) columns, (4) dtype, (5) copy 의 5가지가 있습니다.

 

(1-1) data : numpy ndarray, dict, DataFrame 등의 data source

(1-2) index : 행(row) 이름, 만약 명기하지 않으면 np.arange(n)이 자동으로 할당 됨

(1-3) column : 열(column) 이름, 만약 명기하지 않으면 역시 np.arnage(n)이 자동으로 할당 됨

(1-4) dtype : 데이터 형태(type), 만약 지정하지 않으면 Python이 자동으로 추정해서 넣어줌

(1-5) copy : 입력 데이터를 복사할지 지정. 디폴트는 False 임. (복사할 거 아니면 메모리 관리 차원에서 디폴트인 False 설정 사용하면 됨)

 

 

3행 4열짜리 간단한 DataFrame을 만들어보겠습니다.  data  란에 input data 지정은 필수로 해줘야 하구요, 나머지 index, columns, dtype, copy는 별도로 명기를 안해줘도 디폴트 세팅이 적용되어서 DataFrame이 생성이 되긴 합니다.

 

 

In [2]: df_1 = df(data=np.arange(12).reshape(3, 4),

   ...: index=['r0', 'r1', 'r2'], # Will default to np.arange(n) if no indexing

   ...: columns=['c0', 'c1', 'c2', 'c3'],

   ...: dtype='int', # Data type to force, otherwise infer

   ...: copy=False) # Copy data from inputs

 

In [3]: df_1

Out[3]: 
    c0  c1  c2  c3
r0   0   1   2   3
r1   4   5   6   7
r2   8   9  10  11

 

 

 

 

  (2) DataFrame 의 Attributes 조회하기

 

 

다음으로 DataFrame의 Attributes을 조회하는 방법을 소개하겠습니다.

참고로, 아래 Attributes의 끝에는 괄호 ()를 붙이지 않으니 헷갈리지 않도록 조심하세요.

 

 

(2-1) T : 행과 열 전치 (transpose)

 

 

In [5]: df_1.T # Transpose index and columns

Out[5]:

c3   3   7  11
c0   0   4   8
c1   1   5   9
c2   2   6  10
c3   3   7  11 

 

 

 

(2-2) axes : 행과 열 이름을 리스트로 반환

 

 

In [6]: df_1.axes

Out[6]:

[Index(['r0', 'r1', 'r2'], dtype='object'),

Index(['c0', 'c1', 'c2', 'c3'], dtype='object')]

 

 

 

 

(2-3) dtypes : 데이터 형태 반환

 

 

In [7]: df_1.dtypes # Return the dtypes in this object

Out[7]:

c0 int32

c1 int32

c2 int32

c3 int32

dtype: object

 

 

 

 

(2-4) shape : 행과 열의 개수(차원)을 튜플로 반환

 

 

In [22]: df_1.shape # Return a tuple representing the dimensionality of the DataFrame

Out[22]: (3, 4)

 

 

 

 

(2-5) size : NDFrame의 원소의 개수를 반환

 

 

In [23]: df_1.size # number of elements in the NDFrame

Out[23]: 12

 

 

 

 

(2-6) values : NDFrame의 원소를 numpy 형태로 반환

 

 

In [24]: df_1.values # Numpy representation of NDFrame

Out[24]:

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

 

 

 

다음번 포스팅에서는 DataFrame에서 indexing 하는 방법을 소개하겠습니다.

 

 

728x90
반응형
Posted by Rfriend
,