▶ [SQL] WITH RECURSIVE 개념 정리
▶ 데이터 시각화 & 전처리 심화 실습
1. 데이터 조회
iloc 정수 기반 인덱스 사용loc 레이블 기반 인덱스 사용1-1. iloc : 인덱스 번호로 선택하기
1-2. loc : 이름으로 선택하기
1-3. loc : 조건 필터
cond = (df['age'] >= 70
cond # 결과값 : True/False
df.loc[cond] # True인 행만 필터링
# 나이 컬럼만 가져오기
df.loc[cond, 'age']
df.loc[cond, 'age'] = -1
1-4. loc : 다중조건
&와 | 연산자로 복합 조건 생성# 조건1 정의
cond1 = (df['fare'] > 30)
# 조건2 정의
cond2 = (df['who'] == 'woman')
df.loc[cond1 & cond2]
df.loc[cond1 | cond2]
1-5. isin()
sample = pd.DataFrame({'name': ['kim', 'lee', 'park', 'choi'],
'age': [24, 27, 34, 19]
})
sample['name'].isin(['kim', 'lee']) # True/False 칼럼
condition = sample['name'].isin(['kim', 'lee'])
sample.loc[condition] # name 컬럼에 kim 또는 lee가 있는 행만 조회
1-6. select_dtypes()
df.select_dtypes(include=None, exclude=None)include 및 exclude 는 비어있거나 겹치면 에러 발생np.number 또는 numberobjectnp.datetime64, datetime, 또는 datetime64np.timedelta64 또는 timedelta64category # include 사용
df.select_dtypes(include=[float,bool])
# exclude 사용
df.select_dtypes(exclude=['int64'])
# 혼합 사용
df.select_dtypes(include =[float,object], exclude=['int64'])
2. 데이터 정렬
2-1. sort_values
by에 기준이 되는 행 설정 (여러개 지정 가능)df.sort_values(by=['col1', 'col2'], ascending = [False, True])
3. 데이터 변경
3-1. astype()
df['column'] = df['column'].astype('int32')3-2. copy()
deep: True / False (기본값 = True)deep=True deep=Falsedf_copy = df.copy(deep = True)
# df2 = df와 같은 식으로 복사할 경우 sallow copy가 됨
3-3. 행 추가 : append()
self.append(other, ignore_index=False, veryfy_integrity=False, sort=Falseother : self 객체에 행 기준으로 합칠 객체ignore_index : 기존 인덱스를 사용할지 여부 verify_integrity : 합칠 때 이름이 중복되는 인덱스가 있는 경우 오류를 발생시킬지 여부sort : 열을 사전적으로 정렬할지 여부df.append(df, sort=True, ignore_index=True)
3-4. 열 추가: insert()
df.insert(loc, column, value, allow_duplicates = False)loc : 삽입될 열의 위치column : 삽입될 열의 이름value : 삽입될 열의 값allow_duplicates : True / False (기본값 False, True일 경우 중복 열 삽입 허용)# 4열로 설정, column 이름 col4, value로 값 설정하여 열 추가
df.insert(3, 'col4', [10, 11, 12])
3-5. 행/열 삭제 : drop()
df.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')label : 삭제할 레이블명axis : label 인수를 사용할 경우 지정할 축0 - index / 1 - columnsindex : 인덱스명을 입력해서 바로 삭제 가능column : 컬럼명을 이용해서 바로 삭제 가능level : 멀티인덱스의 경우 레벨을 지정inplace : 원본을 변경할지 여부True - 원본 변경error : 삭제할 레이블을 찾지 못할 경우 오류 띄울지 여부ignore할 경우 존재하는 레이블만 삭제# 행삭제
df.drop(labels='row2',axis=0, inplace = True)
df.drop(index='row3', inplace = True)
# 열삭제
df.drop(labels=['col1','col2'],axis=1,inplace=True)
df.drop(columns='col3', inplace = True)
3-6. 인덱스 설정 : set_index()
df.set_index(df.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)keys: 인덱스로 설정할 열의 이름drop : 인덱스로 설정할 열을 기존 열에서 제거할지 여부True ( 열에서 제거 )append : 기존 인덱스를 유지하면서 새 인덱스를 추가할지 여부inplace : 원본을 대체할지 여부verify_intergrity : 추가하려는 인덱스에 중복값이 있을 경우 오류로 띄울지 여부# col1을 인덱스로 만들기
df.set_index(keys = 'col1', inplace = True)
3-7. 인덱스 변경: reindex()
df.reindex(labels=None, index=None, columns=None, axis=None,method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)labels : 변경할 값, labels 인수를 이용할 경우 axis 인수를 통해 축을 지정해야 함index / columns : 변경할 값method : bfill / ffill / nearestffill : 바로 전 값으로 결측치를 채움bfill : 바로 뒤 값으로 결측치를 채움nearest : 근처의 유효값으로 결측치를 채움copy : 사본을 생성할지 여부 level : Multy Index의 경우 레벨 선택 가능fill_value : 결측값을 이 값으로 변경 가능limit : method 인수를 사용할 경우 몇 개까지 변경할지 제한 가능tolerance : method 인수를 사용할 때 index가 다를 경우 허용 범위df.reindex(labels=col2,axis=1) # labels로 변경값을 정해주면 axis를 이용해 적용할 축을 지정해줘야함.
df.reindex(columns=col2,fill_value='-')
3-8. 인덱스를 열로 변경: reset_index()
df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')level : Multi Index의 경우 제거할 인덱스의 레벨 설정 가능drop : 제거한 인덱스를 열에 추가할지 여부False (제거된 인덱스 열로 반환)inplace : 원본 변경 여부col_level / col_fill : Multi Index의 경우 제거된 인덱스를 열에 추가할 때 레벨의 열과 이름 설정 가능col_level을 통해 레벨 설정col_fill을 통해 해당 열의 이름 설정df.reset_index(inplace=True)
# 멀티 레벨일 경우
df2.reset_index(level=0)
df2.reset_index(level=1,col_fill='COL0')
4. 결측값 처리
4-1. 결측값 확인 : isna() / isnull()
True 반환df.isna()
df.isna().sum()
df['col'].isna()
4-2. 결측이 아닌 값 확인 : notna() / notnull()
False를 반환df.notna()
df.notna().sum()
df['col'].notna()
4-3. 결측값 제거 : dropna()
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)axis : 결측치 제거를 진행할 레이블0 - index / 1 - columnshow : any 존재하면 제거 / all 모두 결측치면 제거tresh : 결측값이 아닌 값이 몇 개 미만일 경우에만 적용시키는 인수subset : dropna 메서드를 수행할 레이블 지정inplace : 원본 변경 여부# 행을 기준으로 하나라도 결측값이 있으면 삭제
df.dropna(axis=0, how='any', inplace = True)
# 열을 기준으로 모든 값이 결측값이면 삭제
df.dropna(axis=1, how='all', inplace = True)
# 특정 컬럼에 대해서만 결측값 제거
df.dropna(subset=['col1','col2'])
4-4. 결측값 채우기 - fillna() / fillnull()
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)value : 결측값을 대체할 값, dict 형태로도 가능method : 결측값을 변경할 방식bfill - 결측값을 바로 아래 값과 동일하게 변경ffill - 결측값을 바로 위 값과 동일하게 변경axis : fillna 메서드를 적용할 레이블0 - index / 1 - columnslimit : 결측값을 변경할 횟수downcast : 다운캐스트 할지 여부 downcast = 'infer'일 경우 float64를 int64로 변경df.fillna('A',inplace=True)
# 딕셔너리 형태로 결측값 대체
dict = {'col1':'A','col2':'B','col3':'C','col4':'D','col5':'E'}
df.fillna(value=dict), inplace = True)
5. 중복값 처리
5-1. 중복값 확인 : duplicated()
df.duplicated(subset=None, keep='first')subset : 특정 열만을 대상 (list 사용 가능)keep : 검사 순서 지정first - 처음 나온 것을 keeplast - 마지막에 나온 것을 keepFalse - 둘 다 중복값으로 봄# row1과 row2가 같을 때
df.duplicated(keep='first') # row1 False, row2 True
df.duplicated(keep='last') # row1 True, row2 False
df.duplicated(keep=False) # row1 True, row2 True
5-2. 중복값 제거 : drop_duplicates()
df.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)subset : 중복값을 검사할 열keep : 중복 제거를 할 때 남길 행first : 첫 값을 남김last : 마지막 값을 남김inplace : 원본 변경 여부ignore_index : 원래 인덱스를 무시할지 여부# 모든 열에 대한 중복값 제거
df.drop_duplicates(inplace = True)
# 특정열에 대한 중복값 제거
df.drop_duplicates(subset=['col1','col2'])
df.drop_duplicates(subset='col1',keep='first')
df.drop_duplicates(subset='col1',keep='last',ignore_index=True)