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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
# -*- coding: utf-8 -*-
"""Day 02_03_Exploratory Data Analysis_2.ipynb
Automatically generated by Colaboratory.
Original file is located at
    https://colab.research.google.com/drive/1aKOiYKseQJaftEnNTBfEcEdkVRr0wi_V
"""
 
import pandas as pd
import numpy as np
 
# aixs = 0 -> 행 결합, 1 = 열 결합 , join = 'inner' 교집합만 합치겠다 , outter -> 합집합만 합치겠다 ,join_zxes = 인덱스를 새로 만들지 말지 결정.,
# ignore_index = T = 기존의 인덱스를 무시하고 새로 만들겠다. keys => 계층적 인덱스를 사용할떄, varify_integrity = > 유니크한 속성을 유지할지 말지 결정
 
 
df1 = pd.DataFrame({'A': ['A0''A1''A2'],
    'B': ['B0''B1''B2'],
    'C': ['C0''C1''C2'],
    'D': ['D0''D1''D2']},
    index=[012])
 
 
df2 = pd.DataFrame({'A': ['A3''A4''A5'],
    'B': ['B3''B4''B5'],
    'C': ['C3''C4''C5'],
    'D': ['D3''D4''D5']},
    index=[345])
 
"""###데이터 프레임을 합칠때 사용하는 함수 concat"""
 
df12a0 = pd.concat([ df1, df2 ], axis = 0)
 
df12a0
 
df3 = pd.DataFrame({'E': ['A6''A7''A8'],
    'F': ['B6''B7''B8'],
    'G': ['C6''C7''C8'],
    'H': ['D6''D7''D8']},
    index=[012])
df4 = pd.DataFrame({'A': ['A0''A1''A2'],
     'B': ['B0''B1''B2'],
     'C': ['C0''C1''C2'],
     'E': ['E0''E1''E2']},
     index=[013])
 
df1
 
df3
 
"""열의 이름이 다를때 axis = 0 이 기본이므로 남은 자리에는 NaN이 들어간다"""
 
pd.concat([ df1, df3 ])
 
df13a1 = pd.concat( [ df1, df3 ], axis = 1)
 
df1
 
df4
 
## 행결합시 없는 컬럼에는 NaN 발생. join의 default는 outer => 합집합
df14o = pd.concat([df1, df4])
df14o
 
# join을 inner로 주게되면 Nan이 발생하는 부분은 모두 빠져버린다.
df14i = pd.concat( [ df1, df4 ], join = 'inner')
df14i
 
pd.concat( [ df1, df4 ], axis = 1, join = 'outer')
 
pd.concat( [ df1, df4 ], axis = 1, join = 'inner')
 
pd.concat([df1, df4], axis = 1 )
 
# 특정 데이터 프레임의 인덱스를 활용하고자 할때.
# df1의 데이터 프레임을 기준으로 합칠지 확인
df14ja1 = pd.concat([df1, df4], axis = 1 , join_axes = [df1.index])
 
df5 = pd.DataFrame({'A': ['A0''A1''A2'],
     'B': ['B0''B1''B2'],
     'C': ['C0''C1''C2'],
     'D': ['D0''D1''D2']},
     index=['r0''r1''r2'])
 
 
df6 = pd.DataFrame({'A': ['A3''A4''A5'],
     'B': ['B3''B4''B5'],
     'C': ['C3''C4''C5'],
     'D': ['D3''D4''D5']},
     index=['r3''r4''r5'])
 
df5
 
df6
 
#ignoew pulse -  Flllllllllllllas
df56 = pd.concat([df5, df6])
 
pd.concat([df5, df6], ignore_index = True )
 
#계층적 인덱스 구성
df56 = pd.concat([ df5, df5], keys = ['df5''df6'])
 
## key가 df5인 행들 조회.
df56.ix['df5']
 
pd.concat( [df5, df6], keys = ['df5','df6'])
 
## 2 depths dfname , rownum
pd.concat( [df5, df6], keys = ['df5','df6'], names = ['dfname''rownum'])
 
## 인덱스 명이 중복이 있는지 없는지 확인
 
df7 = pd.DataFrame({'A': ['A0''A1''A2'],
     'B': ['B0''B1''B2'],
     'C': ['C0''C1''C2'],
     'D': ['D0''D1''D2']},
     index=['r0''r1''r2'])
 
df8 = pd.DataFrame({'A': ['A2''A3''A4'],
     'B': ['B2''B3''B4'],
     'C': ['C2''C3''C4'],
     'D': ['D2''D3''D4']},
     index=['r2''r3''r4'])
 
df7
 
df8
 
## 인덱스 이름이 r2가 두개가 있으나 별 문제 없이 CONCAT이 된다.
pd.concat([df7, df8])
 
## 인덱스 중복 검사를 하기 때문에 인덱스가 중복될경우 에러를 내도록 한다.
pd.concat([df7, df8], verify_integrity = True)
 
"""#Concat과 Append를 활용한 DataFrame 과 Series 의 결합
    
###DataFrame과 Series의 결합 => DataFrame
"""
 
df1 = pd.DataFrame({'A': ['A0''A1''A2'],
    'B': ['B0''B1''B2'],
    'C': ['C0''C1''C2'],
    'D': ['D0''D1''D2']},
    index=[012])
 
df1
 
## 시리즈의 이름으로 준 문자열은 추후에 컬럼명이 된다
ser = pd.Series( [ 's1','s2','s3' ], name = 'E' )
ser
 
pd.concat([df1, ser], axis = 1, ignore_index = True)
 
pd.concat([df1, ser], axis = 1)
 
s1 = pd.Series([345])
s2 = pd.Series([345])
s3 = pd.Series([345])
 
## concat에서 열이름을 주기.
pd.concat([s1, s2, s3], axis = 1, keys = ['c1''c2''c3'])
 
"""# Merge"""
 
# merge 함수 : how (left, right , inner(기본값), outer)
# on         : 병합의 기준이 되는 변수
 
 
dfleft = pd.DataFrame({'KEY': ['K0''K1''K2''K3'],
    'A': ['A0''A1''A2''A3'],
    'B': ['B0''B1''B2''B3']})
 
dfright = pd.DataFrame({'KEY': ['K2''K3''K4''K5'],
    'C': ['C2''C3''C4''C5'],
    'D': ['D2''D3''D4''D5']})
 
dfleft
 
dfright
 
"""Key를 기준으로 병합 가능(조인)"""
 
# 기본 inner 조인
pd.merge(dfleft, dfright)
 
pd.merge(dfleft , dfright , on = "KEY", how = "left")
 
pd.merge(dfleft , dfright , on = "KEY", how = "right")
 
pd.merge(dfleft , dfright , on = "KEY", how = "outer" )
 
dfleft = pd.DataFrame({
    'A': ['A0''A1''A2''A3'],
    'B': ['B0''B1''B2''B3']},
                     index = ['K0''K1''K2''K3'])
 
dfright = pd.DataFrame({
    'C': ['C2''C3''C4''C5'],
    'D': ['D2''D3''D4''D5']},
                      index = ['K2''K3''K4''K5'])
 
dfleft
 
dfright
 
"""공통 컬럼이 없을때"""
 
## 왼쪽 ,오른쪽 모두다 존재하는 인덱스에 대한 데이터 병합
pd.merge( dfleft, dfright, left_index = True, right_index = True )
 
pd.merge( dfleft, dfright, left_index = True, right_index = True , how = 'left')
 
## dfleft에다가 () 안에 있는것을 조인하라.
 
dfleft.join(dfright, how = 'left')
 
"""#결측치에 대한 처리"""
 
dfleft = pd.DataFrame({'KEY': ['K0''K1''K2''K3'],
    'A': ['A0''A1''A2''A3'],
    'B': ['B0''B1''B2''B3']})
 
 
dfright = pd.DataFrame({'KEY': ['K2''K3''K4''K5'],
    'C': ['C2''C3''C4''C5'],
    'D': ['D2''D3''D4''D5']})
 
dfa = pd.merge( dfleft, dfright, on="KEY", how = "outer")
dfa
 
dfa.isnull()
 
dfa.isnull().any()
 
dfa.notnull()
 
# None 과 NaN 확인
dfa.info()
 
dfleft = pd.DataFrame({'KEY': ['K0''K1''K2''K3'],
    'A': ['A0''A1''A2''A3'],
    'B': [1.12.2 , 3.3 , 4.4]})
 
 
dfright = pd.DataFrame({'KEY': ['K2''K3''K4''K5'],
    'C': ['C2''C3''C4''C5'],
    'D': ['D2''D3''D4''D5']})
 
 
dfa = pd.merge( dfleft, dfright, on="KEY", how = "outer")
 
dfa.info()
 
dfa
 
dfa.ix[ 0 : 11 : 3# dfa.ix[[0,1], ['A', 'B']]
 
dfa.ix [ 0 : 1 , ['A''B']] = None
 
# None 과 NaN이 둘다 공존하고 있다.
# 열의 타입이 오브젝트인 경우에 None이 들어가고 숫자일 경우에 NaN이 들어간다.
 
dfa
 
## info를 찍어보면 entries - non-null앞에 수로 null이 몇개인지 알 수 있다.
dfa.info()
 
# 각각의 컬럼별로 null이 몇개인지 알 수 있다.
dfa.isnull().sum()
 
#특정 열에 대해서만 null의 갯수를 센다.
dfa['A'].isnull().sum()
 
## 행별 널이 있는지 없는지 확인
dfa.isnull().sum(axis = 1)
 
"""파생 변수 ( 컬럼 추가 )"""
 
## 널 갯수를 표시하는 컬럼 추가
dfa['NaN_Num'= dfa.isnull().sum(axis = 1)
 
dfa
 
dfa['NotNaN_Num'= dfa.notnull().sum(axis = 1)
 
dfa
 
df = pd.DataFrame(np.arange(10).reshape(5,-1),
                 columns = ['c1''c2'],
                 index   = ['a','b','c','d','e'])
 
df
 
"""b,e 행 c1열에 None,  b,c c2열 None 대입"""
 
df.ix[ ['b''e'] , ['c1'] ] = None
df.ix[ ['b''c'] , ['c2'] ] = None
 
df
 
# 기본 axis = 0 , NaN을 0으로 취급한다.
df.sum()
 
# 누적합
df.cumsum()
 
# NaN을 아애 대상에서 제외시켜 버린다.
# axis 기본 = 0
 
df.mean()
 
df.std()
 
df
 
#데이터 프레임 연산에서는 NaN은 NaN을 리턴한다.
 
df['c3'= df['c1'+ df['c2']
df
 
"""#결측치 대체"""
 
df = pd.DataFrame(np.random.randn(5,3),
            columns = ['c1','c2','c3'])
 
df
 
df.ix[ 00 ] = None
df.ix[ 1, ['c1''c3']  ] = np.nan
df.ix[ 2, ['c2']  ] = np.nan
df.ix[ 3, ['c2']  ] = np.nan
df.ix[ 4, ['c2']  ] = np.nan
 
## NaN에다가 숫자 넣기
df.fillna(100)
df.fillna( 'missing' )
 
df.fillna(method = 'ffill')
 
df.fillna(method = 'ffill', limit = 1)
 
## NaN의 자리에  평균 넣기
df.mean()
 
df.fillna(df.mean())
 
# c1의 평균으로 모든 컬럼을 채운다.
df.fillna(df.mean()['c1'])
 
"""Numpy Where 절을 활용한 NA 대체"""
 
df2 = pd.DataFrame({'a1' : [1,2,3,4,5],
                    'a2' : [10,11,12,13,14]})
df2.ix[[1,3], ['a2'] ] = None
 
df2
 
# a3열 추가
# a2열의 값이 NaN이면 a1의 값으로 a3열을 채우고 a2열이 NaN이 아니면 a2열의 값으로 a3열을 채우라.
 
df2['a3'= np.where( df2['a2'].notnull() == True, df2['a2'], df2['a1'])
 
df2
 
 
cs


'딥러닝 모델 설계 > Machine Learning' 카테고리의 다른 글

Day 4. binomializing [ OneHotEncoding ]  (0) 2019.07.06
Day 03. Scaler  (0) 2019.07.03
Day 03. Replacement  (0) 2019.07.03
Day 02. Pandas Review - 1  (0) 2019.07.02
Day 01. Numpy Fundamental Operations Review  (0) 2019.07.01

+ Recent posts