[파이썬을 이용한 데이터 분석] 3. Pandas
* 본 포스팅은 '파이썬 라이브러리를 활용한 데이터 분석' 책 스터디 및 수업 내용 정리를 위한 것입니다*
Pandas
고수준의 자료 구조와 파이썬에서 빠르고 쉽게 사용할 수 있는 데이터 분석 도구를 포함하고 있다.
pandas는 다른 산술 계산 도구인 Numpy, Scipy, 분석 라이브러리인 statsmodels와 scikt-learn, 시각화 도구인 metplotlib과 함께 사용하는 경우가 흔하다. pandas는 for 문을 사용하지 않고 데이터를 처리한다거나 배열 기반의 함수를 제공하는 등 Numpy의 배열 기반 계산 스타일을 많이 차용했다.
Pandas와 Numpy의 가장 큰 차이점은 pandas는 표 형식의 데이터나 다양한 형태의 데이터를 다루는 데 초점을 맞춰 설계했다는 것! Numpy는 단일 산술 배열 데이터를 다루는 데 특화 되어 있다.
Series와 DataFrame 이 두 가지 자료 구조를 공부한다. 이 두 가지 자료구조로 모든 문제를 해결할 수는 없으나, 대부분의 애플리케이션에서 사용하기 쉬우며 탄탄한 기반을 제공한다.
(참조: 파이썬 라이브러리를 활용한 데이터 분석)
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
'TECH > Data' 카테고리의 다른 글
[파이썬을 이용한 데이터 분석] 6. pandas 4 (0) | 2020.07.10 |
---|---|
[파이썬을 이용한 데이터 분석] 5. Pandas 3 (0) | 2020.06.02 |
[파이썬을 이용한 데이터 분석] 4. Pandas 2 (0) | 2020.06.02 |
[파이썬을 이용한 데이터 분석] 2. Numpy 2 (0) | 2020.05.28 |
[파이썬을 이용한 데이터 분석] 1. Numpy (0) | 2020.05.21 |