[혼공데분] 3주차 : Chapter 03

·2024년 7월 21일
0
post-thumbnail

3주차 진도(7/15 ~ 7/21) : Chapter 03

✅ 기본 미션

p. 182의 확인 문제 2번 풀고 인증하기


✅ 선택 미션

p. 219의 확인 문제 5번 풀고 인증하기



📖 내용 정리

데이터 정제 (data cleaning)

  • 데이터에서 손상/부정확한 부분 수정, 불필요한 데이터 삭제 또는 불완전한 값 교체하는 등의 작업
  • 분석 목적에 맞게 데이터 변환
    • 데이터 랭글링 (data wrangling) / 데이터 먼징(data munging)의 일부

열 삭제

  • loc 함수 + 슬라이싱
    • 원하는 열만 선택
    • ns_book = ns_df.loc[:, '번호':'등록일자']
    • 중간의 열 제외할 땐 사용하기 어려움
  • loc 함수 + 불리언 배열(boolean array)

    • 원소별 비교(element-wise comparison) 이용 → 열을 불리언 배열로 표현 가능
    • # 불리언 배열 얻기
      selected_columns = ns_df.columns != 'Unnamed: 13'
      # True인 열의 모든 행 선택
      ns_book = ns_df.loc[:, selected_columns]
  • drop() 함수

    • 행 & 열 삭제
    • 열 삭제
      • 첫 번째 매개변수 = 열 이름
      • axis 매개변수 = 1
      • inplace 매개변수 = True이면 바로 수정
    • # 원하는 열 지정해 삭제
       ns_book = ns_df.drop('Unnamed: 13', axis=1)
      # 불리언 배열 이용해 중간 열 제외 (여러 개 열 삭제 시 리스트 형식 사용)
       ns_book = ns_df.drop(['부가기호','Unnamed: 13'], axis=1)
      # 선택한 데이터프레임에 덮어쓰기
       ns_book = ns_df.drop('주제분류번호', axis=1, inplace=True)
  • dropna() 함수

    • NaN이 하나 이상 포함된 행이나 열 삭제
      • axis 매개변수 = 1
      • how 매개변수 = all이면 모든 값 NaN인 열 삭제
    • ns_book = ns_df.dropna(axis=1, how=all')

행 삭제

  • drop() 함수

    • 행 & 열 삭제
    • 행 삭제
      • axis 매개변수 = 기본값 0 (생략 가능)
      • inplace 매개변수 = True이면 바로 수정
  • []연산자 + 슬라이싱 / 불리언 배열

    • []연산자에 슬라이싱 / 불리언 배열 전달 → 행 선택 가능
    • # 인덱스 0, 1인 행 제외 모든 행 선택
       ns_book = ns_book[2:]
       # 슬라이싱 사용해 처음 2개 행 선택
       ns_book = ns_book[:2]
       # 불리언 배열 이용해 행 선택
       selected_rows = ns_df['출판사'] == '한빛미디어'
       ns_book2 = ns_book[selected_rows]
       # 조건 넣어 행 선택
       ns_book2 = ns_book[ns_book['대출건수'] > 1000]

중복 행 찾기

  • duplicated() 함수
    • 중복 여부 표시한 불리언 배열 반환
      • 중복 행 중 처음 행 제외 나머지 → True
      • 중복 안된 나머지 모든 행 → False
    • subset 매개변수
      • 일부 열 기준으로 중복된 행 찾기
      • 여러 열 찾을 땐 리스트 형식으로 입력
    • keep 매개변수 = False
      • 중복된 모든 행을 True로 표시한 불리언 배열 반환
      • 또는 ~ 연산자 사용도 가능
      • # 중복 행 True 표시
        dup_rows= ns_book.duplicated(subset=['도서명', '저자', 'ISBN', '권'])
        # 불리언 배열 반전시켜 고유 행 True 표시
        unique_rows = ~dup_rows
        # 고유 행 선택
        ns_book3 = ns_book[unique_rows].copy()

그룹별 모으기

  • groupby 함수
    • 원하는 열 기준으로 합치기
    • by 매개변수
      • 행 합칠 때 기준되는 열 지정
      • 지정 열**NaN 포함 시 해당 행 삭제**
    • dropna 매개변수
      • False = 연산 시 NaN 있는 행도 포함
    • # 정수 타입 열 합 연산 처리
      group_df = count_df.groupby(by=['도서명', '저자', 'ISBN', '권'], dropna=False).sum()

원본 데이터프레임 인덱스 설정

  • set_index() 함수
    • 지정한 열을 인덱스로 설정
    • inplace 매개변수 = True로 바로 수정 가능
    • ns_book3.set_index(['도서명', '저자', 'ISBN', '권'], inplace=True)

원본 데이터 프레임 업데이트

  • update() 함수
    • 다른 데이터프레임으로 원본 데이터프레임 값 업데이트
    • # 그룹으로 묶으면서 대출건수 합친 데이터프레임
      loan_count = group_df.sum()
      # 원본에 업데이트
      ns_book3.update(loan_count)
      # 인덱스 재설정
      ns_book4 = ns_book3.reset_index()

열 순서 바꾸기

  • [] 연산자에 원하는 순서대로 전달하는 것이 제일 간단
  • ns_book4 = ns_book4[ns_book.columns]

equals() 함수

  • 다른 데이터프레임과 동일한지 비교
  • ns_book4.equals(new_ns_book4)


info() 함수

  • 데이터프레임 정보 요약해 출력
    • 전체 행 개수
    • 열 개수
    • 열 이름 - 누락된 값 없는 행 개수 - 열 데이터 타입
    • 사용하는 데이터 타입
    • 메모리 사용량
  • 열마다 NaN이 아닌 값 몇 개인지 확인 가능

isna() 함수

  • 각 행이 비어 있는지 나타내는 불리언 배열 반환
  • 뒤에 sum() 호출 → 불리언 배열의 True 개수 = 비어 있는 행 개수
  • ns_book.isna().sum()


누락된 값으로 표시

  • 임의로 누락된 값을 만든 후 NaN으로 표시하는 방법
    • 정수 저장 열에 파이썬의 None 입력
    • 문자열 저장 열에 넘파이 패키지의 np.nan 입력
  • # 정수 저장 열
    ns_book4.loc[0, '도서권수'] = None
    # 문자열 저장 열
    ns_book4.loc[0, '부가기호'] = np.nan

astype() 함수

  • 데이터 타입 지정할 때 사용
  • 매개변수 → 딕셔너리 형태로 전달
    • ns_book4 = ns_book4.astype({'도서권수': 'int32', '대출건수': 'int32'})

누락된 값 바꾸기

  • loc() 함수 + fillna() 함수
    • fillna()에 원하는 값 전달하면 그 값으로 NaN 대체
    • ns_book4.fillna('없음').isna()
      # 특정 열만 바꾸기 -> 개수만 있는 판다스 시리즈 객체 반환
      ns_book4['부가기호'].fillna('없음').isna()
      # 바꾸면서 전체 데이터 프레임 반환
      ns_book4.fillna({'부가기호': '없음'}).isna()
  • replace() 함수
    • 어떤 값도 바꿀수 있음
    • 경우에 따라 사용법 다양
      # 바꾸려는 값 1개
      ns_book4.replace(원래 값, 새로운 값)
      # 바꾸려는 값 여러 개
      ns_book4.replace([원래 값1, 원래 값2, ...], [새로운 값1, 새로운 값2, ...])
      # 열마다 다른 값으로
      ns_book4.replace({열이름: 원래 값}, 새로운 값)


정규 표현식 (regular expression, 정규식)

  • 문자열 패턴 찾아 대체하기 위한 규칙의 모음

  • regex 매개변수 = True → 정규 표현식 사용한다는 의미

  • 정규 표현식 앞 r문자다른 문자열과 구분하기 위해 접두사처럼 사용

  • \1, \2 : 패턴 안의 그룹 의미 → 등장 순서대로 번호 매김

  • 괄호를 일반 문자로 사용하려면 앞에 역슬래시(\) 추가

  • 사용

    ## 숫자 찾기 : \d
    # 패턴 안의 첫 번째 그룹으로 연도 변경 : 4자리수 -> 2자리수
    ns_book4.replace({'발행년도': {r'\d\d(\d\d)': r'\1'}}, regex=True)[100:102]
    # 정규식 반복 시 중괄호로 개수 지정
    ns_book4.replace({'발행년도': {r'\d{2}(\d{2})': r'\1'}}, regex=True)[100:102]
    
    ## 문자 찾기 : 마침표(.)
    # 문자는 반복 개수 지정 어려우므로 * 문자 사용 -> 0개 이상 반복 의미
    # 찾으려는 패턴
    ns_book4.replace({'저자': {r'(.*)\s\(지은이\)(.*)\s\(옮긴이\)': r'\1\2'}}, '발행년도': {r'\d\d(\d\d)': r'\1'}}, regex=True)[100:102]
    
    ## 숫자 아닌 모든 문자 대응 표현 : \D
  • contains() 함수

    • 시리즈나 인덱스에서 문자열 패턴 포함하고 있는지 검사
    • 정규 표현식 인식 가능
    • na 매개변수 = True : 원하는 행을 찾으면 True로 표시
  • gt() 함수

    • 전달된 값보다 큰 값 찾기
    • 대신 부등호 사용도 가능
  • lt() 함수

    • 전달된 값보다 작은 값 찾기
    • 대신 부등호 사용도 가능

0개의 댓글