- 데이터에서 손상되거나 부정확한 부분을 수정하고, 불필요한 데이터를 삭제하거나 불완전한 값을 교체하는 등의 작업.
- 데이터 정제는 데이터를 분석 목적에 맞게 변환하는 데이터 랭글링(Data Wrangling), 데이터 먼징(Data Munging) 의 일부로 수행될 수 있다.
loc 메서드에 슬라이싱을 사용하면 원하는 열까지 선택하여 새로운 데이터프레임을 만들 수 있다.
e.g.)
ns_book = ns_df.loc[:, '번호':'등록일자'] ns_book.head()
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개의 행을 출력한다.
drop() 메서드 사용해서 데이터프레임의 행이나 열을 삭제할 수 있다.
axis 매개변수에 0을 지정하거나, 아무것도 지정 안하면 행이 삭제됩니다.
e.g.)
ns_book = ns_df.drop(['부가기호', 'Unnamed: 13'], axis=1) ns_book.head()
ns_df.drop(['부가기호', 'Unnamed: 13'], axis=1, inplace=True) ns_df.head()
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()
행을 삭제할 때도 drop() 메서드를 사용할 수 있다. (axis 매개변수를 0으로 지정하거나 생략하면 된다.)
첫 번째 매개변수로 삭제할 행을 리스트 형태로 전달한다. (흔하게 사용하는 방법 아님 ❌)
e.g.)
ns_book = ns_df.drop([0,1], axis=0) ns_book.head()
[] 연산자와 슬라이싱
[] 연산자에 슬라이싱이나 불리언 배열을 전달하면 행을 선택한다.
e.g.)
ns_book2 = ns_book[2:] ns_book2.head()
[] 연산자에 슬라이싱을 사용하면 파이썬의 슬라이싱처럼 마지막 인덱스를 포함하지 않는다.
e.g.)
ns_book2 = ns_book[0:2] # 처음 2개의 행만 선택 ns_book2.head()
[] 연산자와 불리언 배열
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()
e.g.)
ns_book_loc = ns_book.loc[selected_rows] ns_book_loc.head()
판다스 데이터프레임의 중복된 행은 duplicated() 메서드를 사용해서 검사할 수 있다.
중복된 행 중에서 처음 행을 제외한 나머지 행은 True로, 중복되지 않은 나머지 모든 행은 False로 표시하는 불리언 배열을 반환한다.
파이썬의 sum() 함수를 함께 사용하면, True를 1로 인식하기 때문에 duplicated() 메서드로 만든 불리언 배열에서 중복된 행의 갯수를 셀 수 있다.
기본적으로 데이터프레임에 있는 모든 열을 기준으로 중복된 행을 찾는다.
ns_book.duplicated(subset=['도서명', '저자', 'ISBN'])
keep 매개변수를 False로 지정하면 중복된 모든 행을 True로 표시하여 어떤 데이터가 중복되었는지 확인 가능하다.
first
: default, 중복된 항목 중 첫 번째 항목을 제외한 모든 행을 True로 반환last
: 중복된 항목 중 마지막 항목을 제외한 모든 행을 True로 반환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