본문 바로가기

코딩/Python

[파이썬] 혼자 공부하는 데이터 분석(03-2 잘못된 데이터 수정하기)

반응형
#1 ns_book4 정보확인
#2 ns_book4  누락된 개수 보기
#3 '도서권수'열의 0행을 nan으로 지정하고 확인
#4 다시 1로 바꾸고 '도서권수, 대출건수'를 int형으로 바꾸기
#5 ns_book4의 '부가기호'의 NaN을 '없음'문자열로 변환
#6 replace를 이용하여 nan을 '없음'으로 변경
#7 nan을 없음, 2021을 21로 변경
#8 '부가기호'열의 nan을 '없음'으로 변경
#9 2개 열('부가기호', '발행년도')을 2개 새로운 값으로 변환(nan을 없음, 2021을 21)
#10 정규표현식을 이용하여 '발행년도'열의 2021을 21로
#11 '저자'열의 (지은이), (옮긴이) 삭제,
#12 '발행년도'의 '1988'이 포함된 모든 문자열의 행을 찾고,
#13 [2019] 또는 2019.와 같은 문자열을 숫자를 제외하고 삭제
#14 나머지 nan이거나 네 자리 숫자가 아닌 값을 -1로 변경
#15 4000 이상의 연도는 2333을 뺌.
#16 나머지 숫자 모두 -1로 변경
import pandas as pd
import numpy as np
 
#1 ns_book4 정보확인
ns_book4 = pd.read_csv('ns_books4.csv', low_memory = False)

#2 ns_book4  누락된 개수 보기
ns_book4.isna().sum()

#3 '도서권수'열의 0행을 nan으로 지정하고 확인
ns_book4.loc[0, '도서권수'] = None
ns_book4['도서권수'].isna().sum()

#4 다시 1로 바꾸고 '도서권수, 대출건수'를 int형으로 바꾸기
ns_book4.loc[0, '도서권수'] = 1
ns_book4 = ns_book4.astype({'도서권수':'int32', '대출건수': 'int32'})

#5 ns_book4의 '부가기호'의 NaN을 '없음'문자열로 변환
ns_book4['부가기호'].fillna('없음').isna().sum()

#6 replace를 이용하여 nan을 '없음'으로 변경
ns_book4.replace(np.nan, '없음').isna().sum()

#7 nan을 없음, 2021을 21로 변경
ns_book4.replace({np.nan: '없음', '2021' : '21'}).head()

#8 '부가기호'열의 nan을 '없음'으로 변경
ns_book4.replace({'부가기호': np.nan}, '없음').head(2)

#9 2개 열('부가기호', '발행년도')을 2개 새로운 값으로 변환(nan을 없음, 2021을 21)
ns_book4.replace({'부가기호': {np.nan : '없음'},
                  '발행년도': {'2021' : '21'}}).head(2)

#10 정규표현식을 이용하여 '발행년도'열의 2021을 21로
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]

#11 '저자'열의 (지은이), (옮긴이) 삭제,
ns_book4.replace({'저자': {r'(.*)\s\(지은이\)(.*)\s\(옮긴이\)':r'\1\2'},
                 '발행년도': {r'\d{2}(\d{2})': r'\1'}}, regex = True)[100:102]

#12 '발행년도'의 '1988'이 포함된 모든 문자열의 행을 찾고,
ns_book4['발행년도'].str.contains('1988').sum()

#13 [2019] 또는 2019.와 같은 문자열을 숫자를 제외하고 삭제
ns_book5 = ns_book4.replace({'발행년도':'.*(\d{4}).*'}, r'\1', regex = True)

#14 나머지 nan이거나 네 자리 숫자가 아닌 값을 -1로 변경
unkown_year = ns_book5['발행년도'].str.contains('\d', na=True)
ns_book5.loc[unkown_year, '발행년도'] = '-1'
ns_book5 = ns_book5.astype({'발행년도': 'int32'})

#15 4000 이상의 연도는 2333을 뺌.
dangun_year = ns_book5['발행년도'] > 4000
ns_book5.loc[dangun_year, '발행년도'] = ns_book5.loc[dangun_year, '발행년도'] - 2333
dangun_year = ns_book5['발행년도'] > 4000
print(dangun_year.sum())

#16 나머지 숫자 모두 -1로 변경
old_books = (ns_book5['발행년도'] >0) & (ns_book5['발행년도'] < 1900)
ns_book5.loc[old_book, '발행년도'] = -1

 

출처: 혼자 공부하는 데이터 분석

반응형