[혼공분석] 3주차 - 1

LeeHsss·2025년 1월 25일
0

데이터 분석

목록 보기
4/9
post-thumbnail

Chapter 03. 데이터 정제하기

03-1. 불필요한 데이터 삭제하기

데이터 정제란? (Data Cleaning)

  • 데이터에서 손상되거나 부정확한 부분을 수정하고, 불필요한 데이터를 삭제하거나 불완전한 값을 교체하는 등의 작업.
    • 데이터 정제는 데이터를 분석 목적에 맞게 변환하는 데이터 랭글링(Data Wrangling), 데이터 먼징(Data Munging) 의 일부로 수행될 수 있다.

열 삭제하기 (pandas)

  1. loc 메서드에 슬라이싱을 사용하면 원하는 열까지 선택하여 새로운 데이터프레임을 만들 수 있다.

    • 하지만, 중간에 있는 열을 제외하고 선택할 때 슬라이싱을 사용하기는 어렵다.

    e.g.)

     ns_book = ns_df.loc[:, '번호':'등록일자']
     ns_book.head()
  2. loc 메서드와 불리언 배열을 사용

    💡 불리언 배열

    • Index 클래스를 비롯한 판다스 배열 성격의 객체는 어떤 값과 비교할 때 자동으로 배열에 있는 모든 원소와 하나씩 비교한다. => 원소별 비교
    • 원소마다 비교한 결과를 불리언 배열로 나타낸다.

    e.g.)

    selected_columns = ns_df.columns != 'Unnamed: 13' # 원소별 비교, ⭐️Numpy Array 반환⭐️
    ns_book = ns_df.loc[:, selected_columns] # True인 열의 모든 행을 선택한다.
    ns_book.head() # 상위 5개의 행을 출력한다.
  3. drop() 메서드 사용해서 데이터프레임의 행이나 열을 삭제할 수 있다.

    • drop() 메서드로 열을 삭제하려면, 첫 번째 매개변수에 열 이름을 전달하고 axis 매개변수를 1로 지정한다.
      • axis 매개변수에 0을 지정하거나, 아무것도 지정 안하면 행이 삭제됩니다.

        e.g.)

        ns_book = ns_df.drop(['부가기호', 'Unnamed: 13'], axis=1) 
        ns_book.head()
    • 첫 번째 매개변수에 제외할 열 이름을 리스트 형식으로 여러개 지정할 수 있다.
    • inplace 매개변수를 True로 지정하면 현재 선택한 데이터프레임을 바로 수정할 수 있다.
      • 내부적으로 수정된 새로운 객체를 만든 후에 선택한 객체랑 연결하기 때문에 성능상 이득은 없다.
        ns_df.drop(['부가기호', 'Unnamed: 13'], axis=1, inplace=True) 
        ns_df.head()
  4. dropna() 메서드 사용

    • 기본적으로 NaN이 하나 이상 포함된 행이나 열을 삭제한다. (axis 매개변수로 행, 열을 지정)

      e.g.)

      ns_book = ns_df.dropna(axis=1) 
      ns_book.head()
    • 모든 값이 NaN인 행이나 열을 삭제하려면 dropna() 메서드에 how 매개변수를 'all'로 지정한다.

      e.g.)

      ns_book = ns_df.dropna(axis=1, how='all') 
      ns_book.head()

행 삭제하기 (pandas)

  1. 행을 삭제할 때도 drop() 메서드를 사용할 수 있다. (axis 매개변수를 0으로 지정하거나 생략하면 된다.)

    • 첫 번째 매개변수로 삭제할 행을 리스트 형태로 전달한다. (흔하게 사용하는 방법 아님 ❌)

      e.g.)

      ns_book = ns_df.drop([0,1], axis=0) 
      ns_book.head()
  2. [] 연산자와 슬라이싱

    • [] 연산자에 슬라이싱이나 불리언 배열을 전달하면 행을 선택한다.

      e.g.)

      ns_book2 = ns_book[2:]
      ns_book2.head()
    • [] 연산자에 슬라이싱을 사용하면 파이썬의 슬라이싱처럼 마지막 인덱스를 포함하지 않는다.

      • loc 메서드에 슬라이싱을 사용하면 마지막 인덱스를 포함.

      e.g.)

      ns_book2 = ns_book[0:2] # 처음 2개의 행만 선택 
      ns_book2.head()
  3. [] 연산자와 불리언 배열

    • 행을 선택할 때 가장 즐겨 사용하는 방법.
    • 비교 연산자를 활용해 원하는 행은 True로 표시하고, 제외할 행은 False로 표시한 불리언 배열을 만들어 사용한다.

    e.g.)

    selected_rows = ns_df['출판사'] == '한빛미디어'
    ns_book2 = ns_book[selected_rows]
    ns_book2.head()
    • 불리언 배열을 만드는 조건을 [] 연산자에 바로 넣는 경우도 있다.

    e.g.)

    ns_book_1000 = ns_book[ns_book['대출건수'] > 1000]
    ns_book_1000.head()

💡 loc 메서드에 불리언 배열을 사용하여 행을 선택할 수 있을까? (가능)

  • ns_book.loc[selected_rows, :]처럼 슬라이싱을 사용해 전체 열을 선택한다는 것을 명시적으로 표현할 수도 있음

e.g.)

ns_book_loc = ns_book.loc[selected_rows]
ns_book_loc.head()

중복된 행 찾기: duplicated()

  • 판다스 데이터프레임의 중복된 행은 duplicated() 메서드를 사용해서 검사할 수 있다.

  • 중복된 행 중에서 처음 행을 제외한 나머지 행은 True로, 중복되지 않은 나머지 모든 행은 False로 표시하는 불리언 배열을 반환한다.

  • 파이썬의 sum() 함수를 함께 사용하면, True를 1로 인식하기 때문에 duplicated() 메서드로 만든 불리언 배열에서 중복된 행의 갯수를 셀 수 있다.

  • 기본적으로 데이터프레임에 있는 모든 열을 기준으로 중복된 행을 찾는다.

    • 💡 일부 열을 기준으로 중복된 행을 찾으려면 duplicated() 메서드의 subset 매개변수에 기준 열을 나열한다.
      ns_book.duplicated(subset=['도서명', '저자', 'ISBN'])
  • keep 매개변수를 False로 지정하면 중복된 모든 행을 True로 표시하여 어떤 데이터가 중복되었는지 확인 가능하다.

    • first: default, 중복된 항목 중 첫 번째 항목을 제외한 모든 행을 True로 반환
    • last: 중복된 항목 중 마지막 항목을 제외한 모든 행을 True로 반환

그룹별로 모으기: groupby()

  • 특정 조건으로 데이터를 그룹핑할 때 사용한다.
  • by 매개변수에는 행을 합칠 때 기준이 되는 열을 지정한다.

원본 데이터 업데이트하기

  • 중복된 행을 True로 표시한 불리언 배열을 반전시킬 때는 판다스의 ~ 연산자를 사용한다.
  • 데이터프레임의 복사본을 만들 때는 copy() 메서드를 사용한다.
    • 판다스는 copy() 메서드를 사용하지 않으면 데이터프레임이 별도의 메모리 공간에 저장되는지 보장하지 않는다.
  • 다른 데이터프레임을 사용해 원본 데이터프레임의 값을 업데이트 할 때는 update() 메서드를 사용한다.

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

  • 지정한 열을 인덱스로 설정할 때는 set_index() 메서드를 사용한다.
    • 이 때 inplace 매개변수를 True로 지정해 새로운 데이터 프레임을 반환하는 것이 아라 원본 데이터프레임을 수정할 수 있다.
  • 인덱스 열을 해제할 때는 reset_index() 메서드를 사용한다.
    • 인덱스를 설정하고 해제함에 따라 데이터프레임의 열 순서가 달라진 경우, 기존 데이터프레임과 열 순서를 맞추기 위해서는 [] 연산자에 원하는 열 이름을 순서대로 전달하면 된다.

일괄 처리 함수 만들기

def data_cleaning(fileName):
    """
    남산 도서관 장서 CSV 데이터 전처리 함수 
    :param fileName: CSV 파일 이름 
    """

    # 1. 파일을 데이터프레임으로 읽는다.
    ns_df = pd.read_csv(fileName, low_memory=False)

    # 2. NaN인 열을 삭제한다.
    ns_book = ns_df.dropna(axis=1, how='all')

    # 3. 대출건수를 합치기 위해 필요한 행만 추출하여 count_df 데이터 프레임을 만든다. 
    count_df = ns_book[['도서명', '저자', 'ISBN', '권', '대출건수']]

    # 4. 도서명, 저자, ISBN, 권을 기준으로 대출건수를 groupby
    loan_count = count_df.groupby(by=['도서명', '저자', 'ISBN', '권'], dropna=False).sum()

    # 5. 원본 데이터프레임에서 중복 행 제외, 고유행만 추출 후 복사.
    dup_rows = ns_book.duplicated(subset=['도서명', '저자', 'ISBN', '권']) # 특정 열을 기준으로 중복 행 추출 
    unique_rows = ~dup_rows # 중복 행을 반전
    ns_book3 = ns_book[unique_rows].copy() # 고유행만 추출 후 복사

    # 6. 도서명, 저자, ISBN, 권을 인덱스로 설정.
    ns_book3.set_index(['도서명', '저자', 'ISBN', '권'], inplace=True)

    # 7. loan_count에 저장된 누적 대출건수를 업데이트 
    ns_book3.update(loan_count)

    # 8. 인덱스를 재설정 
    ns_book4 = ns_book3.reset_index()

    # 9. 원본 데이터프레임의 열 순서로 변경.
    ns_book4 = ns_book4[ns_book.columns]
    return ns_book4
profile
조금씩 지식의 영역을 넓혀가는 중이에요...😌

0개의 댓글

관련 채용 정보