컴붕이의 감자 탈출기/혼공분석

[혼공분석]3주차_데이터 정제하기

potato2brain 2025. 1. 25. 02:20

3주차

import pandas as pd
ns_df = pd.read_csv('도서관 자료.csv', low_memory=False)

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

1. 열 삭제하기

loc 메서드와 불리언 배열

- column 속성은 판다스의 index 클래스의 객체로 이 객체의 원소는 파이썬의 리스트처럼 숫자인덱스로 참조 할 수 있다

selected_columns = ns_df.columns != 'unnamed: 13' // 'unnamed: 13'을 제외한 모든 열이 True인덱스를 가짐
ns_book = ns_df.loc[:,selected_columns] //True인 열의 모든 행을 선택

》》 결과값으로 'unnamed: 13' 열이 삭제된 데이터 프레임을 얻게 된다

 

같은 방법으로 '부가기호' 열을 삭제 하려면

selected_columns = ns_df.columns != '부가기호'
ns_book = ns_df.loc[:,selected_columns]

》》 결과값으로 '부가기호' 열이 삭제된 데이터 프레임을 얻게 된다

 

 

drop()메서드

  • drop()메서드를 사용하면 행과 열을 삭제 할 수 있는데 default 값이 'axis=0' 으로 행을 삭제하고 'axis=1'로 설정 할 경우 열을 삭제한다
  • drop('삭제하려는 열 이름', axis = ) 형태로 사용한다
ns_book = ns_df.drop('Unnamed: 13', axis = 1) //Unnamed: 13 열 삭제
ns_book = ns_df.drop(['부가기호','Unnamed: 13'], axis = 1) // Unnamed: 13, 부가기호 열 동시 삭제

 

여기서 inplace 매개변수를 사용하는 경우 ns_book과 같은 새로운 변수에 담지 않고 바로 수정할 수 있다

ns_df.drop('주제분류번호', axis = 1, inplace = True) //선택한 데이터프레임에 그대로 덮어씀

 

dropna()메서드

  • NaN이 하나 이상 포함된 행이나 열을 삭제한다
  • 모든 값이 NaN인 열을 삭제 하려면 dropna()메서드에 how 매개변수를 'all'로 지정하면 된다

⚠️판다스 데이터프레임에서 NaN이란 누락되거나 존재하지 않는 데이터를 의미한다. NULL이라고 보면 될듯!

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

 

열 삭제하기에서는 drop()메서드를 이용하는 것이 불리언배열을 이용하는 것보다는 간편할듯...?

2. 행 삭제하기

[ ] 연산자와 슬라이싱

ns_book2 = ns_book[2:]
//인덱스가 0,1인 행을 제외한 모든 행을 선택하기 위한 코드

 

[ ] 연산자와 불리언 배열

  • 행을 선택할 때 가장 즐겨 사용하는 방법
  • 원하는 행은 True로 표시하고 제외할 행은 False로 표현한 불리언 배열을 만들어 사용
selected_rows = ns_df['출판사'] == '한빛미디어'
ns_book2 = ns_book[selected_rows]
//출판사가 한빛미디어에 해당하는 열들만 출력

❗️실제로 많은 판다스 사용자들은 불리언 배열을 만드는 조건을 [ ]연산자에 바로 넣음

ns_book2 = ns_book[ns_book['대출건수'] > 1000]

 

중복된 행 찾기: duplicated 메서드

  • 중복된 행 중에서 처음 행을 제외한 나머지 행은 True로, 그 외에 중복되지 않은 나머지 모든 행은 False로 표시한 불리언 배열을 반환함
  • 기본적으로 데이터 프레임에 있는 모든 열을 기준으로 중복된 행을 찾음
  • subset 매개변수를 사용해 일부 열을 기준으로 중복된 행을 찾을 수 있음
  • keep 매개변수를 False로 지정하여 중복된 모든 행을 True로 표시 가능
  • drop_duplicated()메서드를 이용해 중복된 행 삭제도 가능
dup_rows = ns_book.duplicated(subset = ['도서명','저자','ISBN'], keep = False)
ns_book = ns_book[dup_rows] // 중복된 모든 행을 저장한 데이터프레임

 

 

그룹별로 모으기: groupby 메서드

  • by 매개변수로 행을 합칠때 기준이 되는 열을 지정
  • 기준이 되는 열에 NaN이 포함 되어 있으면 해당 행을 삭제함 --> 매개변수 dropna = False로 설정해 NaN이 있는 행도 포함 가능
loan_count = count_df.groupby(by = ['도서명', '저자', 'ISBN', '권'], dropna=False).sum()
loan_count.head() 
//sum 메서드 사용해서 대출권수를 합쳐줌
//인덱스가 ['도서명', '저자', 'ISBN', '권']열로 이루어진 데이터프레임 출력

 

 

데이터프레임의 복사본 만들기: copy() 메서드

  • 판다스는 copy()를 사용하지 않으면 데이터프레임이 별도의 메모리 공간에 저장되는지 보장하지 않음
  • 명시적으로 복사하지 않고 열을 업데이트한다면 원본 데이터가 바뀔 수도 있음
  • 일부 행이나 열을 선택하여 데이터를 업데이트 할때는 항상 복사하는 것이 좋음
원본 데이터프레임 인덱스 설정 set_index() 메서드 ['도서명', '저자', 'ISBN', '권'] 처럼 열 이름을 집어넣어 인덱스 설정 가능
원본 데이터프레임 업데이트 하기 update() 메서드  
인덱스 열 해제 reset_index() 메서드  

 

p.179 일괄처리함수 만들기

 

필수 과제

 

 

 

 

03-2  잘못된 데이터 수정하기

데이터프레임 정보 요약하기 : info()메서드

 

누락된 값 개수 확인하기: isna( )메서드

  • NaN을 직접 카운트
  • 각 행이 비어 있는지를 나타내는 불리언 배열을 반환

 

 

누락된 값 바꾸기

fillna()메서드

  • 원하는 값을 전달하면 NaN을 대체함
ns_book4.fillna('없음') #NaN이 들어있는 모든 값을 '없음'으로 교체
ns_book4.fillna({'부가기호': '없음'}) #부가기호 열에 있는 NaN을 전부 교체

 

replace() 메서드

  • NaN은 물론 어떤 값도 바꿀 수 있는 편리한 메서드
  • 사용법이 다양함
#바꾸려는 값이 하나일 때
replace(원래값,새로운값)

#바꾸려는 값이 여러 개일 때
replace([원래 값1,원래 값2], [새로운 값1, 새로운 값2])
replace({원래 값1 : 새로운 값1}, {원래 값2: 새로운 값2})

#열 마다 다른 값으로 바꿀 때
replace({열 이름: 원래 값}, 새로운 값)
replace({열 이름:{원래 값: 새로운 값}})

 

그 외 메서드들

DataFrame.astype() 데이터 타입을 지정 DataFrame.astype({'열 이름' : 'int32'})
Series.str.contains() 시리즈나 인덱스에서 문자열 패턴을 포함하고 있는지 검사 특정 문자열을 포함하는지 쉽게 확인 가능

 

데이터 프레임 원소를 비교할 수 있는 메서드

메서드 부등호 내용
gt() > 지정된 값보다 큰 값을 검사합니다
ge() >= 지정된 값보다 크거나 같은 값을 검사합니다
lt() < 지정된 값보다 작은 값을 검사합니다
le() <= 지정된 값보다 작거나 같은 값을 검사합니다
eq() == 지정된 값과 같은 값을 검사합니다
ne() != 지정된 값과 같지 않은 값을 검사합니다

 

추가숙제 : p.218 2번문제

정답: 1

2.df.fillna(method='bfill')의 결과

3. df.fillna(method='ffill',axis=1)의 결과

4. df.fillna(method='bfill',axis=1)의 결과