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

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

데이터 정제 (data cleaning)
열 삭제
loc 함수 + 슬라이싱ns_book = ns_df.loc[:, '번호':'등록일자']loc 함수 + 불리언 배열(boolean array)
# 불리언 배열 얻기
selected_columns = ns_df.columns != 'Unnamed: 13'
# True인 열의 모든 행 선택
ns_book = ns_df.loc[:, selected_columns]drop() 함수
axis 매개변수 = 1# 원하는 열 지정해 삭제
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 매개변수 = 1how 매개변수 = all이면 모든 값 NaN인 열 삭제ns_book = ns_df.dropna(axis=1, how=all')행 삭제
drop() 함수
axis 매개변수 = 기본값 0 (생략 가능)[]연산자 + 슬라이싱 / 불리언 배열
[]연산자에 슬라이싱 / 불리언 배열 전달 → 행 선택 가능# 인덱스 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() 함수TrueFalsesubset 매개변수keep 매개변수 = FalseTrue로 표시한 불리언 배열 반환~ 연산자 사용도 가능# 중복 행 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() 함수
isna() 함수
sum() 호출 → 불리언 배열의 True 개수 = 비어 있는 행 개수ns_book.isna().sum()누락된 값으로 표시
NaN으로 표시하는 방법None 입력np.nan 입력# 정수 저장 열
ns_book4.loc[0, '도서권수'] = None
# 문자열 저장 열
ns_book4.loc[0, '부가기호'] = np.nanastype() 함수
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() 함수