1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | # -*- coding: utf-8 -*- """Day 03_01_Replacement.ipynb Automatically generated by Colaboratory. Original file is located at https://colab.research.google.com/drive/1j7fz_7h2hVUqhCJPzlHBhH_35OEztVkS """ import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler, RobustScaler import io from google.colab import files uploaded = files.upload() for fn in uploaded.keys(): print('User uploaded file "{name}" with length {length} bytes'.format(name=fn, length=len(uploaded[fn]))) df = pd.read_csv(io.StringIO(uploaded['train.csv'].decode('utf-8'))) """#보간법을 적용한 NA값 대체""" df = pd.DataFrame(np.random.randn(5, 3), columns = ['c1', 'c2', 'c3']) df ## 단순 문자열 리스트 dfdate = ['07/3/2019', '07/4/2019', '07/5/2019', '07/6/2019'] dfdate ## 날짜형식 타입 // 년 - 월 - 일 순서의 날짜로 인식 myDate = pd.to_datetime(dfdate) myDate times = pd.Series([1, np.nan, np.nan ,20], index = myDate) times """####NaN을 채울때 단순히 채우는것이 아니라 보간법을 적용 앞과 뒤의 선형적인 중앙값으로 대체""" ti = times.interpolate() ti ## 시간에 대해서 보간법, 인덱스가 시계열 날짜인경우만 가능 , 3일 ~ 10일의 차이 7일을 1부터 20까지의 차이 약 20 으로 나눠서 ## 평균 증가값이 3.x 라는 가정을 해서 n번쨰의 경우 n * 3.x 으로 대체 dfdate = ['07/3/2019', '07/4/2019', '07/5/2019', '07/10/2019'] dfdate myDate = pd.to_datetime(dfdate) myDate times = pd.Series([1, np.nan, np.nan ,20], index = myDate) times.interpolate(method = "time") """###DataFrame의 경우 Method = values""" df = pd.DataFrame({"C1":[1,2,np.nan, np.nan, 5], "C2":[6,8,10,np.nan, 20 ]}) ## 결측치의 앞과 뒤의 선형적관계를 따져서 중앙값으로 대체 df.interpolate(method = 'values' ) ## 하나만 바꾸겠다 df.interpolate(method = 'values' , limit = 1) ## 밑에서 위로 하나만 바꾸겠다 df.interpolate(method = 'values' , limit = 1, limit_direction = 'backward') """####NaN값에 대해서 이런식으로 대략적으로 채우는 방법은 적절하지 못하다 ## 결측값과 동시에 특정 값을 조건에 맞는 부분만 대체 Replace 함수 """ S = pd.Series([ 1, 2, 3 , 4, np.nan ]) S ## nan 값을 대체 S.replace(np.nan, 10) S.replace( 3, 100 ) #시리즈의 첫번째 인수를 두번째 인수로 대체 S.replace( [1,2,3], [5,6,7] ) ## 리스트가 아니라 1:1 관계로 1 을 10으로 바꾸도록 할 수도 있다. S.replace( {1:10} ) S.replace( { 1:10, np.nan : 999 } ) """##중복값에 대한 처리""" ## duplicated = > 중복값 찾기 , duplicats => 중복값 처리 , 몇개나 처리할지 옵션 있음. ## 묶었을때 유일하게 표현할 수 있는 값이 무엇인지 생각할것. df = pd.DataFrame( { 'k1' : ['a', 'b', 'c', 'c','b' ], 'k2' : ['v', 'w', 'w', 'x', 'y'], 'c' : [ 1,2,3,4,5 ]}) df.info() ## 어떠한 키를 기준으로 중복이 됬는지 아닌지 확인할 것인지 열 이름을 입력 ## 0번 인덱스부터 순회하되, 첫번째로 만나는 요소는 false, 두번째로 만나는 요소 부터는 True를 리턴. df.duplicated(['k1']) ## 두개의 컬럼을 묶었을때 동시에 같은 행이 있는지 확인. df.duplicated(['k1', 'k2']) ## 모든 중복을 다 True로 반환 하거나 앞에서 부터 만나는 것을 True로 리턴하는 옵션이 있다. ## 기본 -> 두번째로 나오는거부터 Ture df.duplicated(['k1'], keep = 'first') ## last -> 마지막에 나오는 것만 False 나머지는다 True df.duplicated(['k1'], keep = 'last') ## 중복된 모든것을 다 True로 하겠다 df.duplicated(['k1'], keep = False ) ## Duplicates - > 유니크한 요소는 남겨놓고 나머지를 다 날리겠다. ## 기본적으로 Duplicated와 마찬가지로 first가 디폴트 , 첫번째로 나오는것만 살리겠다 df.drop_duplicates( ['k1'] , keep = 'first') df.drop_duplicates( ['k1'] , keep = 'last') df.drop_duplicates( ['k1'] , keep = False ) """###Unique = > 유일한 값을 찾겠다 , Value Counts => 유니크한 값이 몇개가 있는가 ###=> 데이터가 몇건인지에 상관없이 몇 종이 있는지 갯수를 세고자 할때 사용 """ df = pd.DataFrame({ "S":['f','m','m','f','m' ], "D":['a','a','a','a',np.nan], "C":[ 1, 1, 3, 4, 4 ] }) df.info() ## 'S' 컬럼에 대해서 어떤 값으로 이루어져 있는지 확인. df['S'].unique() ## 'D' 컬럼에 대해서 어떤 값으로 이루어져 있는지 확인. NaN도 확인 가능하다. df['D'].unique() ## Unique 함수는 Serise에 있는 메소드. Value counts 또한 Series에 있다. ## Values counts는 각 행에 대해서 각 요소가 몇개가 있는지 확인 가능. table()과 같다. df['S'].value_counts() ## NaN이 몇개인지는 확인이 안된다...! df['D'].value_counts() ## 전체 행수대비 비율을 보고자 할때, NaN은 집계에서 제외 df['S'].value_counts(normalize = True ) ## 결과가 내림차순으로 정렬 ( 갯수에 대해서 ) df['C'].value_counts( sort = True) ## ascending = False 가 기본값 df['C'].value_counts( sort = True, ascending = False ) df['C'].value_counts( sort = True, ascending = True ) ## NaN은 기본적으로 포함되지 않는다, dropna = True가 기본, dropna 하고나서 함수를 적용하겠다. df['D'].value_counts(dropna = False) ## 구간별 value_counts => bins , 연속형 변수에 대해서 사용가능하다. ## 0 ~ 1 까지 , 1 ~ 4 까지 몇개가 들어있는지를 확인한다. df['C'].value_counts( sort = False , bins = [ 0, 1, 4 ] ) df['C'].value_counts( sort = False , bins = [ 0, 1, 2, 3, 4 ] ) ## 카운트는 안하고 구간만 나눈다. res = pd.cut( df['C'], bins = [ 0, 1, 2, 3, 4, 5 ] ) ### 이렇게 해야 나눠진 구간별로 Count를 할 수 있다. pd.value_counts(res) | cs |
'딥러닝 모델 설계 > Machine Learning' 카테고리의 다른 글
Day 4. binomializing [ OneHotEncoding ] (0) | 2019.07.06 |
---|---|
Day 03. Scaler (0) | 2019.07.03 |
Day 02. Pandas Review - 2 (0) | 2019.07.02 |
Day 02. Pandas Review - 1 (0) | 2019.07.02 |
Day 01. Numpy Fundamental Operations Review (0) | 2019.07.01 |