나랑 now

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

혼공학습단/혼공분석

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

nowj8n 2024. 1. 20. 17:05
반응형
# 진도 기본 미션 선택 미션
1주차
(1/2 ~ 1/7)
Chapter 01 p. 81의 확인 문제 4번 풀고 인증하기 p. 71 ~ 73 남산 도서관 데이터를 코랩에서 데이터프레임으로 출력하고 화면 캡처하기
2주차
(1/8 ~ 1/14)
Chapter 02 p. 150의 확인 문제 1번 풀고 인증하기 p. 137 ~ 138 손코딩 실습으로 원하는 도서의 페이지 수를 추출하고 화면 캡처하기
3주차
(1/15 ~ 1/21)
Chapter 03 p. 182의 확인 문제 2번 풀고 인증하기 p. 219의 확인 문제 5번 풀고 인증하기
4주차
(1/22 ~ 1/28)
Chapter 04 p. 279의 확인 문제 5번 풀고 인증하기 Ch.04(04-1)에서 배운 8가지 기술통계량(평균, 중앙값, 최솟값, 최댓값, 분위수, 분산, 표준편차, 최빈값)의 개념을 정리하기
5주차
(1/29 ~ 2/4)
Chapter 05 p. 314의 손코딩(맷플롯립에서 bar()함수로 막대 그래프 그리기)을 코랩에서 그래프 출력하고 화면 캡처하기  p. 316의 손코딩(텍스트 정렬, 막대 조절 및 색상 바꾸기)을 코랩에서 출력하고 화면 캡처하기
6주차
(2/5 ~ 2/12)
Chapter 06 p. 344의 손코딩(맷플롯립의 컬러맵으로 산점도 그리기)을 코랩에서 그래프 출력하고 화면 캡처하기 p. 356 ~ 359의 스택 영역 그래프를 그리는 과정을 정리하기

 

 

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

데이터 정제data cleaning: 데이터에서 손상되거나 부정확한 부분을 수정하고, 불필요한 데이터를 삭제하거나 불완전한 값을 교체하는 등의 작업

데이터 정제는 분석 목적에 맞게 변환하는 데이터 랭글링data wrangling 또는 데이터 먼징data munging의 일부로 수행될 수 있음

 

열 삭제하기

1. loc 메서드와 불리언 배열

new_df = df.loc[:, 시작 열:끝 열]

데이터프레임에서 슬라이싱을 사용하여 표시할 열 범위를 선택할 수 있음.

 

새로운 데이터프레임에서 특정 열을 제외하고 선택하고 싶을 경우, 불리언 배열boolean array 사용

# 판다스의 columns 속성은 index 클래스 객체
# 판다스의 배열 성격의 객체는 어떤 값과 비교할 때 자동으로 배열에 있는 모든 원소와 하나씩 비교함
# new_df.columns = ["혼공", "분석", "파이썬"]
# new_df.columns == "분석"
# "혼공" == "분석" => False
# "분석" == "분석" => True
# "파이썬" == "파이썬" => False

selected_columns = new_df.columns != 원하지 않는 열 인덱스	# 원하지 않는 열 제외된 넘파이 배열 selected_columns에 저장
new_df = df.loc[:, selected_columns]
new_df.head()

 

2. drop() 메서드

new_df = df.drop(배제 열 이름, axis=1)	# axis 매개변수의 기본값 0: 행 삭제

new_df = df.drop([배제 열 이름1, 배제 열 이름2], axis=1) # 여러 개 열 삭제하려면 리스트 형식으로 전달

df.drop(배제 열 이름, axis=1, inplace=True)	# iniplace 매개변수는 선택한 데이터프레임에 덮어씀

판다스를 이용하다보면 데이터에 대한 직접적인 수정을 할 때가 있는데, inplace 매개변수의 기본값은 False다.

배열의 연산을 다루는 넘파이도 배열 복사의 경우 .copy()를 통해 해야한다고 얼마전 다른 책에서 읽었는데 그 이유는 데이터 복사가 너무 빈번하게 사용된다면 성능과 메모리 문제가 발생할 수 있기 때문

 

비어있는 열 삭제

dropna() 메서드

new_df = df.dropna(axis=1)	# NaN이 하나 이상 포함된 행이나 열 삭제, axis=1이므로 열 삭제

new_df = df.dropna(axis=1, how='all')	# 행이나 열의 모든 값이 NaN인 경우 how='all' 지정

 

행 삭제하기

new_df = df.dop([0,1])	# 인덱스 0~1까지의 행 선택, axis=0, 0이 기본값

 

[ ] 연산자와 슬라이싱

new_df = df[시작 인덱스: 끝 인덱스]	# 데이터프레임에 [] 연산자에 슬라이싱이나 불리언 배열을 전달하면 행을 선택

"""
loc 메서드에 슬라이싱을 사용하면 마지막 인덱스를 포함하지만
[]연산자의 슬라이싱은 파이썬의 슬라이싱처럼 마지막 인덱스를 포함하지 않음
"""

 

[ ] 연산자와 불리언 배열

selected_rows = df[열이름] == 원하는 조건값	# 특정 열에 원하는 조건과 일치하는 불리언 배열 생성. !=, >, <, >=, <= 활용 가능
new_df = df[selected_rows]	# 조건값에 해당하는 행만으로 구성된 데이터프레임 생성

 

중복된 행 찾기

sum(new_df.duplicated())	# duplicated() 메서드는 중복된 행 중에서 처음 행을 제외한 나머지 행은 True로, 그 외 중복되지 않은 나머지 행은 False로 표시한 불리언 배열을 반환
				# sum() 함수는 True를 1로 인식하기 때문에 duplicated() 메서드로 생성된 불리언 배열에서 중복 행의 개수를 셀 수 있음
group_df = df.groupby(by=[열1, 열2, 열3], dropna=False).sum()	
"""	by 매개변수에 그룹 기준으로 묶을 열 선택
	groupby 메서드는 기본적으로 지정된 열에 NaN이 있는 행은 삭제처리됨
	이를 막기 위해 dropna=Fasle로 지정
	대출건수 기준 합산을 위해 sum() 활용"""

 

원본 데이터 업데이트하기

원본 데이터 프레임을 업데이트할 때,

  1. duplicated() 메서드로 중복된 행을 True로 표시한 불리언 배열 생성
  2. 1번에서 구한 불리언 배열을 반전시켜 중복되지 않은 고유한 행을 True로 표시
  3. 2번에서 구한 불리언 배열을 사용해 원본 배열에서 고유한 행만 선택

중복된 행을 True로 표시한 불리언 배열을 반전시킬 때는 판다스의 ~연산자 사용

 


기본 미션

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

2. 1번 문제의 df 데이터프레임에서 'col1' 열의 합을 계산하는 명령으로 올바르지 않은 것은 무엇인가요?
  col1 col2 col3
0 1 a NaN
1 2 NaN NaN
2 3 c 100.0
(1) df['col1'].sum()
(2) df[['col1']].sum()
(3) df.loc[:, df.columns == 'col1'].sum()
(4) df.loc[:, [False,False,Ture]].sum()

정답: (4) loc에서 두번째 매개변수로 col3만 True로 전달하여 col3의 합계를 계산함.

[True, False, False]로 해야 col1의 합계 계산.

 

 

참고:

https://velog.io/@ljs7463/판다스-inplace-True를-사용하지-말아야-한는-이유

반응형