< 공부한 내용 >
1. Series
2. DataFrame
1. Series
"""
Series 객체 특징
- pandas 1차원 자료구조 : vector
- 수학/통계 함수 제공
- 범위 수정, 블럭 연산
- indexing 기능
- 시계열 데이터 처리
"""
import pandas as pd # 사용법 : pd.Series()
from pandas import Series # 사용법 : Series()
# 1. Series 생성
# 1) list이용
price = pd.Series( [4000, 3000, 3500, 2000] )
print(price)
'''
0 4000
1 3000
2 3500
3 2000
'''
print(price.index) # RangeIndex(start=0, stop=4, step=1)
print(price.values) # [4000 3000 3500 2000]
# index 적용 : list와 동일(단, - 사용 불가)
price[0] # 4000
price[:3]
price[1:3]
price[2:]
price[:]
# price[-1] Error
price2 = pd.Series( [4000, 3000, 3500, 2000],
index=['a', 'b', 'c', 'd'] )
print(price2)
'''
a 4000
b 3000
c 3500
d 2000
'''
price2['b'] # 3000
price2['b':'d']
'''
b 3000
c 3500
d 2000
'''
# boolean 조건식 - indexing
price2[price2 > 3000]
'''
a 4000
c 3500
'''
# 2) dict 이용
person = Series( { 'name' : '홍길동', 'age' : 35, 'addr' : '서울시'} )
person
'''
name 홍길동
age 35
addr 서울시
'''
person['name'] # 홍길동
person['age'] # 35
# 2. Series 결합과 NA 처리
ser1 = pd.Series([400, 200, 350, 500],
index= ['a', 'o', 'k', 'm'])
ser2 = pd.Series([400, 200, 350, 500],
index= ['o', 'a', 'h', 'm'])
# 결합
ser3 = ser1 + ser2
ser3
'''
a 600.0
h NaN -> NA
k NaN -> NA
m 1000.0
o 600.0
'''
# na 처리(0, 평균)
type(ser3) # pandas.core.series.Series
len(ser3) # 5
zser = ser3.fillna(0)
mser = ser3.fillna(ser3.mean( ))
zser
mser
# na 제외 -> subset
pd.notnull(ser3) # T/F
subset = ser3[pd.notnull(ser3)]
subset
'''
a 600.0
m 1000.0
o 600.0
'''
len(subset) # 3
# 3. Series 연산
ser4 = Series([4.5, 5.2, 6.2, 3.5])
ser4
# 1) 블럭 수정
ser4[1:3] = 3.5 # 인덱스 1~3번의 데이터를 모두 3.5로 수정
ser4
# 2) 수학/통계 함수
ser4.sum() # 15.0
ser4.mean() # 3.75
ser4.max() # 4.5
ser4.var() # 0.25
# 3) broadcast 연산
# - 서로 다른 차원 간의 연산
lst = [1,2,3,4]
lst * 0.5 # error 발생
ser4 * 0.5 # 1차원 * scala(0차원)
'''
0 2.25
1 1.75
2 1.75
3 1.75
'''
2. DataFrame
"""
DataFrame 자료구조 특징
- 2차원 행렬구조 (DB의 table 구조 유사)
- 칼럼 단위 상이한 자료형
- 칼럼 단위 연산을 할 때 용이한 자료구조
- DataFrame 칼럼 추출 -> Series 객체
"""
import pandas as pd # pd.DataFrame( )
from pandas import DataFrame # DataFrame( )
# 1. DataFrame 생성
# 1) 기본 자료구조(list, dict)
name = ['hong', 'lee', 'yoo', 'kang']
age = [35, 45, 25, 55]
pay = [300, 400, 250, 550]
data = pd.DataFrame( {'name' : name, 'age' : age, 'pay' : pay} )
print(data)
'''
name age pay
0 hong 35 300
1 lee 45 400
2 yoo 25 250
3 kang 55 550
'''
data.columns # Index(['name', 'age', 'pay'], dtype='object')
data.index # RangeIndex(start=0, stop=4, step=1)
data.info() # R에서 사용한 str(data) 와 같음
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
name 4 non-null object
age 4 non-null int64
pay 4 non-null int64
dtypes: int64(2), object(1)
memory usage: 176.0+ bytes
'''
# 칼럼 추출 : DF['column']
pay = data['pay']
type(pay) # pandas.core.series.Series
# 칼럼 추가 : DF['colum'] = Series
gender = pd.Series(['남자', '남자', '여자', '남자'])
data['gender'] = gender
data
# 2) numpy : 다차원 배열 객체
import numpy as np
data = np.arange(12).reshape(3, 4) # 3행 4열
print(data)
data.shape # (3, 4)
'''
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
'''
print(type(data)) # <class 'numpy.ndarray'>
# data -> DF
df = DataFrame(data)
print(type(df)) # <class 'pandas.core.frame.DataFrame'>
df.shape # (3, 4)
# 행/열 통계
df
'''
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
'''
df.mean(axis = 0) # 열단위 평균
df.mean(axis = 1) # 행단위 평균
df.mean() # 열단위 평균(axis = 0 : default)
# csv file load
emp = pd.read_csv("../data/emp.csv", encoding="utf-8")
# 상대참조 파일경로로, '../' 부분은 앞의 경로를 생략한 것
# 이렇게 경로를 설정하기 위해서는 현재 작성하고 있는 모듈이 있는 곳에 작업경로(working directory)를 지정해야함
emp.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 3 columns):
No 5 non-null int64
Name 5 non-null object
Pay 5 non-null int64
dtypes: int64(2), object(1)
'''
# 2. DataFrame 칼럼 참조
emp.head() # 칼럼명 + 5개 관측치
# 1) 단일 칼럼
emp.No # DF.column
emp['Pay'] # DF['column'] : 칼럼명에 .(마침표)가 포함된 경우 유용
emp['Name'][3] # DF['column'][n] - '유관순'
emp.Name[3] # '유관순'
# 2) 복수 칼럼
emp[['No', 'Pay']]
#emp[['No' : 'Pay']] # SyntaxError: invalid syntax
cols = ['No', 'Pay']
emp[cols]
# 3. 서브셋
# 1) 특정 칼럼 제외
subset1 = emp[['Name', 'Pay']] # ['No' : 'Pay']는 Error
subset1
# 2) 특정 행 제외
subset2 = emp.drop(1) # 원본 유지
subset2
# 3) 특정 칼럼 기준 -> 행 삭제
# - 급여 350 이하 관측치 제외
subset3 = emp # df 복제
pay = emp.Pay
pay
for i, v in enumerate(pay) : # enumerate는 index, value를 넘김 -> i, v 두개의 인수로 받음
if v <= 350 :
subset3 = subset3.drop(i)
subset3
'''
No Name Pay
1 102 이순신 450
2 103 강감찬 500
4 105 김유신 400
'''
# 4) column 이용 : 변수가 많은 경우
iris = pd.read_csv("../data/iris.csv")
# 상대참조 파일경로로, '../' 부분은 앞의 경로를 생략한 것
# 이렇게 경로를 설정하기 위해서는 현재 작성하고 있는 모듈이 있는 곳에 작업경로(working directory)를 지정해야함
iris.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
Sepal.Length 150 non-null float64
Sepal.Width 150 non-null float64
Petal.Length 150 non-null float64
Petal.Width 150 non-null float64
Species 150 non-null object
'''
sepal_L = iris['Sepal.Length']
sepal_L.mean() # 5.843333333333335
# x(1~4), y(5) 변수 선택
iris.index # 행 이름
iris.columns # 열 이름(칼럼명)
cols = list(iris.columns)
cols
# ['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width', 'Species']
cols[:4] # x변수 칼럼 # 인덱스 0~3까지
cols[-1] # y변수 칼럼
# x, y 변수 선택
iris_x = iris[['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width']]
iris_x = iris[cols[:4]] # 위와 같은 결과
iris_y = iris[cols[-1]]
iris_x.shape # (150, 4) - 2차원
iris_y.shape # (150,) - 1차원
# 4. DF[row, col]
'''
1) loc 속성
형식) DF.loc[행label, 열label]
- DF 대상 행과 열의 레이블 index 참조
- 숫자는 label로 해석
2) iloc 속성
형식) DF.iloc[행int, 열int]
- DF 대상 행과 열의 숫자(integer) index 참조
'''
emp
'''
No Name Pay
0 101 홍길동 150
1 102 이순신 450
2 103 강감찬 500
3 104 유관순 350
4 105 김유신 400
'''
emp.shape # (5, 3)
# 1) loc 속성 : DF.loc[행label, 열label]
emp.loc[0] # 행 default - 1개 요소만 넣으면 행으로 인식
emp.loc[0:3]
# 0~3까지, 4행 전체 (숫자를 index가 아니라label로 인식한 것)
# 만약 숫자를 integer 인덱스로 인식했다면 0~2까지 3행이 출력되어야 함
emp.loc[ : , 'Name']
# 행은 전체(:), 칼럼은 'Name' -> Name 열 전체 출력
# 연속된 행렬 참조(:)
emp.loc[1:3, 'No':'Pay']
'''
No Name Pay
1 102 이순신 450
2 103 강감찬 500
3 104 유관순 350
'''
# 비연속된 행렬 참조 : ( ), [ ] 사용해서 묶어줌
emp.loc[ [0,2,4], ('No','Pay') ]
'''
No Pay
0 101 150
2 103 500
4 105 400
'''
# 2) iloc 속성 : DF.iloc[행int, 열int]
emp.iloc[0]
emp.iloc[0:3] # 0~2까지, 3행 전체 (index로 연속된 데이터 출력할 땐 '끝값-1'번째까지 출력)
emp.iloc[ : , 1] # 2번째 열 전체
# 연속 행렬 선택
emp.iloc[1:4, : ]
# 비연속 행렬 선택은 소괄호 사용시 불가능, 대괄호 사용시 가능
# emp.iloc[(0,2), (0,2)] - Error
emp.iloc[[0,2], [0,2]] # [ ] 가능
##############################
### DF 행렬참조 example
##############################
# iris(150) -> train(70%) / test(30%)
iris.info()
from numpy.random import choice
# from 패키지.모듈 import 함수
help(choice)
# choice(a, size=None, replace=True, p=None)
'''
a : 1-D array-like or int
size : int or tuple of ints
replace : boolean = replace = False (비복원추출)
p : 확률
'''
len(iris) # 150
row_idx = choice(a=len(iris), size=int(len(iris)*0.7), replace=False )
row_idx
len(row_idx) # 105
# train set
train_set = iris.iloc[row_idx]
train_set.shape # (105, 5)
train_set.head()
# test set
test_idx = [i for i in range(len(iris)) if not i in row_idx]
len(test_idx) # 45
test_set = iris.iloc[test_idx]
test_set.shape # (45, 5)
---------------------------------------------------- example ----------------------------------------------------
'Python 과 머신러닝 > II. 데이터처리 문법' 카테고리의 다른 글
[Python 머신러닝] 2장. 차트 시각화 - (3)시계열 데이터 (4) | 2019.10.18 |
---|---|
[Python 머신러닝] 2장. 차트 시각화 - (2)pandas 객체 이용 (0) | 2019.10.17 |
[Python 머신러닝] 2장. 차트 시각화 - (1)matplot (0) | 2019.10.17 |
[Python 머신러닝] 1장. Pandas - (2) 기술통계, DataFrame 병합 (0) | 2019.10.16 |
[Python 머신러닝] 아나콘다 설치 & 스파이더 환경설정 (0) | 2019.10.15 |
댓글