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
매개변수 = 1
how
매개변수 = 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()
함수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()
함수
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()
함수