✏️ 24.12.19 TIL

Dada·2024년 12월 19일

📅 TO DO


  • 아티클 스터디
  • 데이터 시각화 & 전처리 심화 실습
  • [SQL] WITH RECURSIVE 개념 정리
  • Pandas 라이브세션 수강

📝 MEMO


▶ [SQL] WITH RECURSIVE 개념 정리
▶ 데이터 시각화 & 전처리 심화 실습

▶ Pandas 라이브 세션

1. 데이터 조회

  • iloc 정수 기반 인덱스 사용
  • loc 레이블 기반 인덱스 사용

1-1. iloc : 인덱스 번호로 선택하기

  • 행 번호와 열 번호를 통해 특정 행과 열 데이터 선택

1-2. loc : 이름으로 선택하기

  • loc slicing은 [시작(포함): 끝(포함)]

1-3. loc : 조건 필터

  • boolean index를 만들어 조건에 맞는 데이터만 추출
cond = (df['age'] >= 70
cond # 결과값 : True/False

df.loc[cond] # True인 행만 필터링

# 나이 컬럼만 가져오기
df.loc[cond, 'age']
  • 조건 필터 후 원하는 값 대입 가능
df.loc[cond, 'age'] = -1

1-4. loc : 다중조건

  • condition 정의 후 &| 연산자로 복합 조건 생성
# 조건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)
  • includeexclude 는 비어있거나 겹치면 에러 발생
  • 스칼라나 list 형태의 입력값 입력 가능
  • 자료형
    • 숫자형(numeric) : np.number 또는 number
    • 문자형(str): object
    • 날짜, 시간(datetime): np.datetime64, datetime, 또는 datetime64
    • timedeltas: np.timedelta64 또는 timedelta64
    • Pandas의 categorical 타입 : category
 # 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 copy
    • 원본과는 완전하게 별개인 복사본 생성
    • 사본과 원본의 수정은 서로에게 영향을 미치지 않음
  • deep=False
    • shallow copy
    • 원본의 데이터 및 인덱스를 복사하지 않고 새 객체를 호출
    • 원본의 데이터가 수정되면 사본의 데이터도 수정되며, 그 반대도 마찬가지
df_copy = df.copy(deep = True)
# df2 = df와 같은 식으로 복사할 경우 sallow copy가 됨

3-3. 행 추가 : append()

  • self.append(other, ignore_index=False, veryfy_integrity=False, sort=False
  • other : 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 - columns
  • index : 인덱스명을 입력해서 바로 삭제 가능
  • 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: 인덱스로 설정할 열의 이름
    → list 형태로 설정할 경우 Multi Index로 설정
  • 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의 경우 NaN을 요소로 가짐
  • index / columns : 변경할 값
    → 행과 열을 미리 지정
    → 추가된 index의 경우 NaN을 요소로 가짐
  • method : bfill / ffill / nearest
    → 결측치를 채울 규칙
    → 인덱스의 전/후 인덱스 기준
    • ffill : 바로 전 값으로 결측치를 채움
    • 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 - columns
  • how : 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 - columns
  • limit : 결측값을 변경할 횟수
    → 위에서부터 limit으로 지정된 개수만큼만 변경
  • 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 - 처음 나온 것을 keep
    last - 마지막에 나온 것을 keep
    False - 둘 다 중복값으로 봄
# 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)

0개의 댓글