[파이썬을 이용한 데이터 분석] 3. Pandas

2020. 5. 29. 14:54

* 본 포스팅은 '파이썬 라이브러리를 활용한 데이터 분석' 책 스터디 및 수업 내용 정리를 위한 것입니다*

Pandas

고수준의 자료 구조와 파이썬에서 빠르고 쉽게 사용할 수 있는 데이터 분석 도구를 포함하고 있다.

pandas는 다른 산술 계산 도구인 Numpy, Scipy, 분석 라이브러리인 statsmodels와 scikt-learn, 시각화 도구인 metplotlib과 함께 사용하는 경우가 흔하다. pandasfor 문을 사용하지 않고 데이터를 처리한다거나 배열 기반의 함수를 제공하는 등 Numpy의 배열 기반 계산 스타일을 많이 차용했다.

 

Pandas와 Numpy의 가장 큰 차이점은 pandas는 표 형식의 데이터나 다양한 형태의 데이터를 다루는 데 초점을 맞춰 설계했다는 것!  Numpy는 단일 산술 배열 데이터를 다루는 데 특화 되어 있다.

 

SeriesDataFrame 이 두 가지 자료 구조를 공부한다. 이 두 가지 자료구조로 모든 문제를 해결할 수는 없으나, 대부분의 애플리케이션에서 사용하기 쉬우며 탄탄한 기반을 제공한다.

(참조: 파이썬 라이브러리를 활용한 데이터 분석)

 

 

 

1) Series

일련의 객체를 담을 수 있는 1차원 배열 같은 자료 구조로 어떤 Numpy 자료형이라도 담을 수 있다.

Index를 기본적으로 제공하며, 임의로 index 설정도 가능하다

 

Series 객체의 문자열 표현은 왼쪽에 색인을 보여주고 오른쪽에 해당 색인의 값을 보여준다

기본 색인은 정수 0에서 N-1(N=데이터의 길이)

Series의 배열과 인덱스 객체는 각각 values와 index 속성을 통해 얻을 수 있다.

#pandas
import pandas as pd
from pandas import Series
crystal = Series(['a','b','c','d'])
print(crystal, type(crystal))
#index값 출력
print(crystal.index)

결과 :

0 a

1 b

2 c

3 d

dtype: object <class 'pandas.core.series.Series'>

RangeIndex(start=0, stop=4, step=1)

 

  • index, value를 따로 추출할 수 있다. pandas는 numpy 기반이기 때문에 numpy에서 제공하는 함수는 대부분 제공한다.
#index custom하게 설정하기
in_test = Series([3,7,-5,4], index=['a','b','c','d'])
print(in_test)
#value값 출력(배열)
print(in_test.values)

#Series에서 제공하는 sum, python에서 제공하는 sum, numpy에서 제공하는 sum
print(in_test.sum(), ' ', sum(in_test), ' ', np.sum(in_test))

결과 :

a 3

b 7

c -5

d 4

[ 3 7 -5 4]

9 9 9

 

 

import numpy as np
in_test2 = Series([5, -8, 10, 3], index=['a','b','c','d'])
print(in_test2)

#index로 value찾기
print(in_test2['a'])

#index도 함께 출력
print(in_test2[['a']])

결과 :

a 5

b -8

c 10

d 3

dtype: int64

 

5

 

a 5

dtype: int64

 

print(in_test2[['a', 'b']])

print(in_test2['a':'c'])

print(in_test2[2])

print(in_test2[2:4])

print(in_test2[[2, 0]])

print(in_test2 > 0)

print('a' in in_test2)

결과 :

 

  • Series의 색인은 대입하여 변경할 수 있고, Series 객체와 Series의 색인은 모두 name 속성이 있다.
#dict 타입
device = {'mouse': 5000, 'keyboard':25000, 'monitor':'450000'}
print(device)

test = Series(device)
print(test)

#custom index 설정
test.index = ['마우스', '키보드', '모니터']
print(test)

#Series객체와 색인의 name 속성
test.name = '상품가격'
test.index.name = 'device'
print(test)

결과:

{'mouse': 5000, 'keyboard': 25000, 'monitor': '450000'}

mouse 5000

keyboard 25000

monitor 450000

dtype: object

 

마우스 5000

키보드 25000

모니터 450000

dtype: object

 

device

마우스 5000

키보드 25000

모니터 450000

Name: 상품가격, dtype: object

 

 

 

  • Series는 색인 값에 데이터 값을 매핑하고 있으므로 파이썬의 사전형(dict)와 비슷하다. 파이썬 dict형에 데이터를 저장해야 한다면 파이썬의 dict 객체로부터 Series 객체를 생성할 수 있다.
import pandas as pd
#python dict형
data = {'Ohio' :35000, 'Texas' : 71000, 'Oregon': 16000, 'Utah': 5000}

#Pandas Series로 객체 생성
test = pd.Series(data)
print(test)


결과 :

Ohio 35000

Texas 71000

Oregon 16000

Utah 5000 dtype: int64

 

 

2) DataFrame

Dataframe은 표 같은 스프레드시트 형식의 자료구조이고 여러 개의 칼럼이 있는데 각 컬럼은 다른 종류의 값(숫자, 문자열, 불리언 등)을 담을 수 있다. 로우와 컬럼에 대한 색인을 가지고 있다.

Series 객체가 합쳐진 형태

 

 

  • DataFrame basic
from pandas import DataFrame 
obj = [3,-4,9,7]
df = DataFrame(obj)
print(df, type(df))

결과 :

   0

0 3

1 -4

2 9

3 7 <class 'pandas.core.frame.DataFrame'>

 

 

  • DataFrame 객체 생성하기

DataFrame 객체는 다양한 방법으로 생성할 수 있지만, 가장 흔하게 사용되는 방법은 같은 길이의 리스트에 담긴 dict형을 이용하거나 Numpy 배열을 이용하는 것이다. 만들어진 DataFrame의 색인은 Series와 같은 방식으로 자동으로 대입되며 컬럼은 정렬되어 저장된다.

 

(참고)

df1['name']형태로 사용하는 것은 어떤 컬럼이든 가능하지만, df1.name 형태로 사용하는 것은 파이썬에서 사용 가능한 변수 이름 형식일 때만 작동한다.

from pandas import DataFrame
data = {
    'name':['이익준','안정원','채송화','양석형','김준완'],
    'address': ('신당동','역삼동','한남동','역삼동','신사동'),
    'age': [38,35,33,29,34],
}


print(data, type(data))

df1 = pd.DataFrame(data)
print(df1)

#name column만 추출
print(df1['name'])
print(df1.name, type(df1.name))

#원하는 순서대로 columns를 지정하면 원하는 순서를 가진 DataFrame 객체가 생성된다.
print(pd.DataFrame(data, columns=['address','name','age']))

결과 :

 

  • DataFrame index 설정, 결측치

(Data 값은 위에 것을 그대로 쓴다)

 

1) index 설정

from pandas import DataFrame
df2 = DataFrame(data, columns=['name','address','age'], index=['a','b','c','d','e'])
print(df2)

결과 :

   name address age

a 이익준 신당동 38

b 안정원 역삼동 35

c 채송화 한남동 33

d 양석형 역삼동 29

e 김준완 신사동 34

 

2) 결측치

사전에 없는 값을 넘기면 결측치로 저장되어 'NaN'으로 보여준다.

존재하지 않는 컬럼을 대입하면, 새로운 컬럼을 생성한다.

from pandas import DataFrame
df2 = DataFrame(data, columns=['name','address','age','tel'], index=['a','b','c','d','e'])
print(df2)

결과 :

   name address age tel

a 이익준 신당동  38   NaN

b 안정원 역삼동 35   NaN

c 채송화 한남동 33   NaN

d 양석형 역삼동 29   NaN

e 김준완 신사동 34   NaN

 

  • 컬럼에 대입하기

비어 있는 컬럼에 리스트나 배열 및 배열의 값을 대입할 수 있다.
(기존 위에 있는 코드에 이어서) 'tel'이라는 컬럼에 특정 전화번호를 넣어본다.

df2['tel'] = '111-1111'
print(df2)

결과 :

    name address age tel

a 이익준 신당동 38 111-1111

b 안정원 역삼동 35 111-1111

c 채송화 한남동 33 111-1111

d 양석형 역삼동 29 111-1111

e 김준완 신사동 34 111-1111

 

 

이번에는 Series를 대입할 때 특정 index에만 값을 대입해본다.

존재하지 않는 색인에는 결측치가 대입된다.

v = pd.Series(['222-2222', '333-3333', '444-4444'], index=['b','c','e'])
df2['tel'] = v
print(df2)

결과 :

    name address age tel

a 이익준 신당동 38 NaN

b 안정원 역삼동 35 222-2222

c 채송화 한남동 33 333-3333

d 양석형 역삼동 29 NaN

e 김준완 신사동 34 444-4444

 

 

 

BELATED ARTICLES

more