본문 바로가기
Python 과 머신러닝/II. 데이터처리 문법

[Python 머신러닝] 1장. Pandas - (1) Series와 DataFrame

by JoyfulS 2019. 10. 16.

< 공부한 내용 >

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.csv
0.00MB

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.csv
0.00MB

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 ----------------------------------------------------

exam01.py
0.00MB
exam02.py
0.00MB
exam03.py
0.00MB

 

score.csv
0.00MB
wdbc_data.csv
0.12MB

댓글