데이터 분석/자료구조(Data structure)

파이썬 - Pandas 기초 정리(Series)

Jerry Jun 2020. 12. 21. 15:25
728x90

파이썬을 사용했을 때 데이터 분석에 빠질 수 없는 부분이 Pandas 모듈이다. 외부 파일을 읽어 분석하는데 주요한 기능들이 많이 저장되어 있다.

 

import pandas as pd

모듈을 불러올 때 "pd" 를 가장 많이 사용하기 때문에 위와 같이 선언한다.

 

 

1. Series 기초

  • 1차원 배열을 나타내며, numpy의 ndarray 를 기반으로 함.

  • 0개 이상의 데이터를 가질 수 있다.

  • index 는 0 부터 시작.

# 데이터 입력하기

pd.Series([1,2,3,4,5])
---------------------------------
0    1
1    2
2    3
3    4
4    5
dtype: int64

데이터 [1,2,3,4,5] 라는 1차원 배열을 선언하였더니, 각각의 index 가 같이 출력되는 모습을 볼 수 있다.

물론 다른 방법으로도 데이터를 넣을 수 있다.

 

import numpy as np
num = pd.Series(np.arange(1,300,2))
num
-------------------------------------
0        1
1        3
2        5
3        7
4        9
      ... 
145    291
146    293
147    295
148    297
149    299
Length: 150, dtype: int32

numpy 모듈을 사용하여 300까지 홀수만 넣은 결과이다. 이외에도 여러가지의 입력방법이 있을 것이다.

이번에는 index 를 함께 명시하여 입력해보자.

 

 

num1 = pd.Series([1,2,3,4,5], [10, 'a', 5, '30', 2])
num1
-------------------------------------------------
10    1
a     2
5     3
30    4
2     5
dtype: int64

보이는 바와 같이 인덱스는 문자형도 가능하고 숫자를 순서 없이 두어도 입력한 순으로 데이터와 인덱스가 맞추어지는 모습을 볼 수 있다.

 

 

# 데이터 접근하기

num1.index
-------------------------
Index([10, 'a', 5, '30', 2], dtype='object')



num1.values
-------------------------
array([1, 2, 3, 4, 5], dtype=int64)

인덱스와 값은 다음과 같이 접근할 수 있다는 것을 알아보았다.

 

 

# 인덱스 활용하기

num2 = pd.Series([5,4,3,2,1], num1.index)
num2
------------------------------------------
10    5
a     4
5     3
30    2
2     1
dtype: int64

다른 series 를 선언할 때 다른 series 에서 인덱스를 가져와 쓸 수 있다. 물론 shape 가 똑같아야 가능하다.

 

 

# 주요 함수

num = np.random.randint(1, 10, 20)
num = pd.Series(num)
num.value_counts()
----------------------------------
4    6
7    3
9    2
8    2
5    2
2    2
1    2
6    1
dtype: int64

Series 에서 주로 쓰는 함수 중에 하나는 value_count( ) 이다. 기능은 Series 의 빈도를 알려주는 것이다. 위와 같은 경우는 numpy 모듈의 random 을 이용해 1~9 까지의 숫자를 랜덤으로 20개를 만들어 Series 안에 넣고 빈도를 만든 것이다. 숫자 4 가 6개로 가장 많이 나온 것을 알 수 있다.

 

 

num.unique()
-------------------------
array([3, 2, 8, 5, 1, 9, 4, 6])

Series 에서 쓰이는 함수 중 하나인 unique( )중복을 제외하고 어떠한 값들이 있는지 알려주는 기능을 한다.

 


2. Series 데이터 연산

# index 기준 연산

a = pd.Series([1,2,3,4,5], ['a', 'c', 'd', 'e', 'b'])
b = pd.Series([3,2,1,4,5], ['d', 'e', 'a', 'b', 'c'])
a + b
----------------------------------------------------
a    2
b    9
c    7
d    6
e    6
dtype: int64

Series 를 활용해서 각각 같은 인덱스에 대해 연산을 진행할 수 있다. shape 가 같은데 맞는 인덱스가 없으면 연산이 불가능 하기 때문에 NaN 이 반환된다. 

 

 

# 조건에 맞는 데이터 연산

a[a > 3] + b[b < 3]
------------------------
a    NaN
b    NaN
e    6.0
dtype: float64

a 값 중 3 초과인 데이터와 b 값 중 3 미만인 데이터를 더하는 코드를 실행하였더니 NaN 이 2번 뜨고 값이 하나가 나왔다. a 값 중 3이 넘는 값을 가진 인덱스는 b, e 이고, b 값 중 3 아래인 인덱스는 a, e 이다. 이 중 공통적인 인덱스인 e 에 대해서는 연산이 가능하기 때문에 숫자 6.0 이 나왔고, a 와 b 는 연산할 값이 없기 때문에 NaN 이 나오게 되었다.

 


3. Series 데이터 조작

# 기본 Series
num = pd.Series([1,2,3,4,5], ['a','b','c','d','e'])
num
-----------------------------
a    1
b    2
c    3
d    4
e    5
dtype: int64

 

# 데이터 추가/변경하기

num['f'] = 10
num
--------------------
a     1
b     2
c     3
d     4
e     5
f    10
dtype: int64

데이터를 추가하는 방법은 단순하다. 원하는 인덱스를 넣고 값을 추가하면 추가 가능하다. 변경 또한 인덱스를 설정하고 값을 넣으면 변경이 된다.

 

 

# 데이터 삭제하기

num.drop('c')
num
-----------------------
a     1
b     2
c     3
d     4
e     5
f    10

drop( ) 을 사용하는 것이 정답이다. 그런데 지금 보니 c 가 삭제되지 않고 그대로 남아있다. 삭제를 한 순간이 있었지만 저 코드가 실행될 때에만 삭제된 것이다. 바로 삭제한 것을 저장하기 위해서는 inplace 를 활용한다.

 

num.drop('c', inplace=True)
num
------------------------
a     1
b     2
d     4
e     5
f    10
dtype: int64

inplace 를 True 로 하였더니 정상적으로 삭제된 모습을 볼 수 있다.

300x250