본문 바로가기
엑셈 경쟁력/시계열 데이터처리 AI 알고리즘

Chapter 2. Pandas 1편 : Time Series 머신러닝을 위한 Python 필수 라이브러리

by EXEM 2022. 8. 25.

2.2 Time Series 머신러닝을 위한 Python 필수 라이브러리, Pandas 1편

 

 

Pandas?

 

Python Data Analysis Library의 약어이며, R을 모티브로 하여 만들어진 파이썬 라이브러리이다. 쉽고 직관적인 관계형 또는 분류된 데이터로 작업할 수 있도록 설계된 빠르고 유연하며 표현이 풍부한 데이터 구조를 제공하고 있다. Pandas가 필요한 이유는 Numpyndarray 데이터 구조는 산술 연산 작업에서 포맷이 잘 정리된 데이터 타입을 위한 기능들을 제공하고 있지만, 현실 데이터는 생각보다 정돈이 잘 되어있지 않기 때문이다. Pandas는 데이터를 표(table) 형태로 처리할 수 있어서 수집된 데이터의 전처리 등 각종 데이터 핸들링을 쉽고 편하게 할 수 있다. 그렇기 때문에 데이터 분석을 하려면 Pandas또한 필수로 사용해야 한다.

 

 

2.2  Series


리스트, 튜플, 딕셔너리등 여러 객체를 담을 수 있는 1차원 배열 같은 자료구조이다.

 

 

2.2.1.1  series 데이터 생성

 

series의 경우 여러 데이터 타입으로 만들 수가 있는데, 실습을 통해 알아보도록 하자.

 

 1. 딕셔너리로 series 만들기


딕셔너리의 key 값이 index, value값이 cell 값으로 들어간 것을 알 수 있고, series는 딕셔너리와 구조가 비슷하다고 볼 수 있다.

 

in [2]:

import pandas as pd
 
In [3]:
dict_data = {'a':1, 'b':2, 'c':3}
series_data = pd.Series(dict_data)
 
In [4]:
print(series_data)
 
Out [5]:
a    1
b    2
c    3
dtype: int64
 
 
Pandas series 또한 Index, value 확인이 가능하다.
 
In [6]:
print(type(series_data))

 

Out [7]:

<class 'pandas.core.series.Series'>
 
In [8]:
print(series_data.index)

Out [9]:

Index(['a', 'b', 'c'], dtype='object')
 
In [10]:
print(series_data.values)

Out [11]:

[1 2 3]
 

2. 리스트로 만들기
리스트로 만들 경우 딕셔너리와 달리 key 값이 없는 순서형 자료형이기 때문에, 인덱스는 자동으로 0부터 부여된다.

 

In [12]:
list_data = [2,4,6,8]
In [13]:
series_data = pd.Series(list_data)
In [14]:
print(series_data)
 

Out [15]:

0    2
1    4
2    6
3    8
dtype: int64
In [15]:
print(series_data.index)
 

Out [17]:

RangeIndex(start=0, stop=4, step=1)
In [18]:
print(series_data.values)
 

Out [19]:

[2 4 6 8]
 
 
 

튜플의 경우에도 series로 만들 때 리스트와 결과 차이는 없다.

 

In [20]:
tuple_data = (2,4,6,8)
In [21]:
series_data = pd.Series(tuple_data)
 
 

Series 데이터에서 dict 타입으로도 변경이 가능하다.

 
In [22]:
print(series_data.to_dict())
 

Out [23]:

{0: 2, 1: 4, 2: 6, 3: 8}
 

 

2.2.1.2    딕셔너라와 같이 index를 지정해서 series 객체 생성하는 방법

Pandas의 경우 index의 값을 직접 변경해줄 수 있다.

 

In [24]:

series_data = pd.Series(list_data, index = ['a','b','c','d'])
In [25]:
print(series_data)
 

Out [26]:

a    2
b    4
c    6
d    8
dtype: int64

 

 

2.2.2 Dataframe

 

Dataframe은 한 개의 열이 series이고 다수가 모여 dataframe(2차원)을 된다. 데이터프레임에서 하나의 열만 가져오게 된다면, 그건 series(1차원)이다. 그리고 dataframe은 표 같은 스프레드시트 형식의 자료 구조이다.

 

 

2.2.2.1 dataframe 생성

 

Dataframe 또한 여러 방법으로 만들 수 있다.

 

 

1.  딕셔너리로 만들기

 

딕셔너리 안에 있는 key, value들이 각각의 series이고, key들은 column의  이름이 된다.

 
In [27]:
dict_data = {'c0':[1,2,3], 'c1':[4,5,6],'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
df = pd.DataFrame(dict_data)
In [28]:
print(df)
print(type(df))
 
Out [29]:
   c0  c1  c2  c3  c4
0   1   4   7  10  13
1   2   5   8  11  14
2   3   6   9  12  15
<class 'pandas.core.frame.DataFrame'>
 
 
 

2.  리스트로 만들기

리스트들로 dataframe을 만들게 되면 리스트들이 하나의 행과 열이 된다
Series
와 유사하게 values 속성은 dataframe에 저장된 데이터를 2차원 배열로 반환한다.
Dataframe
도 마찬가지로 딕셔너리로 변경이 가능하다

 

 
In [30]:
df = pd.DataFrame([[14,'남'],[17,'여']],
                  index = ['a','b'],
                  columns = ['나이','성별'])
In [31]:
print(df)
print('------')
print(df.index)
print('------')
print(df.values)
print('------')
print(df.to_dict())
 

Out [32]:

   연령 남녀    키  지역  도시
a  14  남  170  서울  서울
b  17  여  155  분당  분당
------
Index(['a', 'b'], dtype='object')
------
[[14 '남' '170' '서울' '서울']
 [17 '여' '155' '분당' '분당']]
------
{'연령': {'a': 14, 'b': 17}, '남녀': {'a': '남', 'b': '여'}, '키': {'a': '170', 'b': '155'}, '지역': {'a': '서울', 'b': '분당'}, '도시': {'a': '서울', 'b': '분당'}}

 

추가로 series도 마찬가지지만 name도 원하는 이름으로 변경이 가능하다.

In [33]:

print(df)
print('------')
print(df.index)
print('------')
print(df.values)
print('------')
print(df.to_dict())
 

SeriesDataframe을 정리해보자면, 딕셔너리로 만들게 되었을 때 데이터프레임의 열을 하나씩 쌓아가는 형태이고, 리스트로 만들면 행을 하나씩 쌓아가는 형태라고 볼 수 있다.

 

2.2.2.2 dataframe 조작

 

1. 열 추가하기

기존 dataframe에 새 열을 추가하는 것은 큰 데이터 셋을 작업할 때 자주 사용된다. 이때 리스트를 dataframe의 행이나 열에 추가하려면 크기(길이)가 동일해야 되고, 그렇지 않으면 오류가 발생한다. 하지만 Series를 추가하게 되었을 땐 해당 index에 존재하지 않을 때엔 결측치(Nan)가 들어가게 된다.

 
 
In [34]:
city = ['서울', '분당']
df['지역'] = city
In [35]:
print(df)
Out [36]:
   연령 남녀    키  지역  도시
a  14  남  170  서울  서울
b  17  여  155  분당  분당
 
첫 번째 매개 변수는 0 부터 시작하는 삽입 index 이다.
 
In [37]:
df.insert(2,'키',['170','155'])
In [38]:
print(df)
 

Out [39]:

   나이 성별    키  지역
a  14  남  170  서울
b  17  여  155  분당
 
 
길이가 동일하지 않을 때,
 
 
In [40]:
df['키'] = ['170']
 

Out [41]:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-52-014fc9cae349> in <module>
----> 1 df['키'] = ['170']

/usr/local/lib/python3.6/site-packages/pandas/core/frame.py in __setitem__(self, key, value)
   3042         else:
   3043             # set column
-> 3044             self._set_item(key, value)
   3045 
   3046     def _setitem_slice(self, key: slice, value):

...
 
 
이외에 assign, loc로도 새로운 열을 추가할 수 있다.
 
In [42]:
df = df.assign(도시 = city)
df.loc[:,'도시'] = city
 
 
 
 
 
 2. 행렬 이름 변경하기
 

둘 다 index 객체이다. 간단하게 변경하려면 수에 맞게 지정해주기만 하면 쉽게 바꿀 수 있다.
 
 
 
In [43]:
print(df.index)
Out[44]:
Index(['a', 'b'], dtype='object')
In [45]:
df.index = ['c','d']
In [46]:
print(df)
Out [47]:
   나이 성별    키  지역  도시
c  14  남  170  서울  서울
d  17  여  155  분당  분당
 
 

3. Rename() 함수사용

위의 방법처럼 하려면 리스트로 넘겨주기 때문에 길이만큼 입력을 해줘야 된다. 그렇게 되었을 때 길이가 맞지 않거나 인덱스를 중복으로 넣는 경우가 생길 수 있으니 함수를 통해 변경하는 것이 좋다. rename(columns={변경 전 열이름, 변경 후 열이름}, inplace=True)로 사용할 수 있고, inplace = True로 옵션을 주게 되면 따로 변수에 넣지 않고 바로 적용이 가능하다.

 
 
 
In [48]:
df.rename(columns={'나이':'연령','성별':'남녀'}, inplace=True)
 
 
 
In [49]:
print(df)
 

Out [50]:

   연령 남녀    키  지역  도시
a  14  남  170  서울  서울
b  17  여  155  분당  분당
 
 
 

 

 

4. Drop() 행 삭제
위와 같이 index또는 columns을 지정해줘도 되고, axis = 0 or 1을 통해 축을 지정해 줘서 사용할 수도 있다.

 

In [51]:
df2 = df.copy()
In [52]:
df2.drop(columns='키', inplace = True)
print(df2)
 

Out [53]:

   나이 성별  지역  도시
c  14  남  서울  서울
d  17  여  분당  분당
In [54]:
df2.drop(index='d', inplace = True)
print(df2)
Out [55]:
   나이 성별  지역  도시
c  14  남  서울  서울

추가로 del예약어를 통해 del df[‘컬럼명' 또는 '인덱스’] 로도 제거가 가능하다.

 

2.2.2.3    조건 추가 및 추출해보기

In [56]:
df = pd.DataFrame([[14,'남'],[17,'여'],[24,'남'],[20,'여'],[15,'남'],[21,'여']],
                  index = ['a','b','c','d','e','f'],
                  columns = ['나이','성별'])
In [57]:
print(df)
 

Out [58]:

   나이 성별
a  14  남
b  17  여
c  24  남
d  20  여
e  15  남
f  21  여
 

그냥 조건만 달게 된다면 numpy mask 와 같이 series 형태(고정된 길이)로 나오게 된다.

 

In [59]:
print(df['나이'] > 20)
 
Out [60]:
a    False
b    False
c     True
d    False
e    False
f     True
Name: 나이, dtype: bool
 
 
해당 불리언 배열만 사용해서 값을 걸러내려면 numpy 와 같이 괄호를 추가해야 한다.
 
In [61]:
print(df[df['나이'] > 20])
 

Out [62]:

   나이 성별
c  24  남
f  21  여

기획 및 글 | AI 1팀 김기중

 

 

 

 

댓글