TIL_88. Cleaning Data in Python (2)

소고기는레어·2021년 4월 5일
0

TIL 📝

목록 보기
90/96
post-thumbnail

2021. 04. 05 월요일

Cleaning Data in Python

Text and categorical data problems

Cleaning text data

  • 텍스트 데이터를 전처리할 때는 특정 문자열을 바꾸는 .replace() 를 사용할 수 있다.
import pandas as pd

# '작성자 바보' 라는 문자열을 '작성자 천재' 로 덮어쓴다.
df['column'] = df['column'].str.replace('작성자 바보', '작성자 천재')
  • assert 는 전처리를 마친 후 마지막으로 검토하는 단계에서 자주 쓰이게 된다.
assert df['column'].str.contains('작성자 바보|작성자 멍청이|작성자 못생김').any() == False
  • 또한 .len() 을 통해 문자열의 길이를 확인하고 비정상으로 보이는 값을 np.nan 등을 통해 잘못된 값임을 나타내는 방법도 사용할 수 있다.
# 'column' 에 포함된 문자열의 글자수를 측정하여 변수를 선언한다.
length = df['column'].str.len()

# 위에서 선언한 변수를 활용하여 글자수가 10 미만인 데이터를 nan으로 표기한다.
df.loc[length < 10, 'column'] = np.nan

# 다시 한 번 글자수를 측정하여 변수를 선언한다.
check = df['column'].str.len()

# 변수를 활용하여 전처리가 제대로 적용 되었는지 확인한다.
assert check.min() >= 10
  • 숫자로만 이루어져 있어야 할 데이터에 다른 기호 등이 포함되어 있을 경우, 아래의 방법으로 숫자를 제외한 다른 문자를 모두 제거할 수 있다.
# 숫자만 남기고 다른 것은 삭제한다.
df['column'] = df['column'].str.replace(r'/d+', '')
# 첫 5줄의 데이터만 출력한다.
df.head()

여기서 .head() 는 첫 ~줄만 출력하는 메소드로 기본값은 5줄이다. 빠르게 데이터를 확인하는데 용이하다.

Advanced data problems

  • 이 챕터에서는 무게, 통화 등 단위의 통일, 데이터가 올바르게 추가 되었는지, 누락된 값이 분석에 어떠한 영향을 주는지 확인하는 법 등을 배우게 된다.
  • 배운 내용을 응용하여 데이터 프레임에 저장된 달러 단위를 전부 원화로 바꾸는 코드를 작성해보자
# 'currency' 가 'dollor'인 데이터를 변수로 선언
cur_$ = dataframe['currency'] == 'dollor'

# 위의 변수 cur_$ 에 부합하는 데이터의 'amount'에 1127.58을 곱해 원화로 환율을 적용하여 저장한다.
dataframe.loc[cur_$, 'amount'] = dataframe.loc[cur_$, 'amount'] * 1127.58

# 변수 cur_$ 에 부합하는 데이터의 'currency' 를 won으로 바꿔 저장한다.
dataframe.loc[cur_$, 'currency'] = 'won'

# 'currency' 에 won만 남아있는지 확인한다.
assert dataframe['currency'].unique() == 'won'
  • 데이터 프레임에 포함된 날짜를 동일한 형식으로 통일시킨 후 연도만 따로 추출하는 코드를 작성해보자
# 'date' 값을 datetime으로 변환
dataframe['date'] = pd.to_datetime(dataframe['date'],

# datetime 형식은 자동감지
infer_datetime_format = True, 

# 변환이 불가능할 경우 어떤 식으로 처리할 것인지 지정
errors = 'coerce')

# 연도만 추출하여 따로 저장
dataframe['year'] = dataframe['date'].dt.strftime('%Y')
  • column a와 b, 그리고 c의 합이 d가 되어야 하는 데이터에서 a+b+c != d 인 데이터를 찾는 코드를 작성해보자
# column a와 b, c 를 한번에 호출할 변수 선언
columns = ['a', 'b', 'c']

# a + b + c = d 변수 선언
compare = dataframe[column].sum(axis = 1) == banking['d']

# 위 조건에 부합하는 데이터와 그렇지 않은 데이터를 나누어 저장
consistent = banking[compare]
inconsistent = banking[~compare]
  • 현재 날짜와 생일을 이용하여 현재 나이가 정확한지 확인하는 코드를 작성해보자
# 현재 날짜 불러오기
today = dt.date.today()

# 현재 날짜와 생일에서 연도만 추출하여 차 구하기
age_calculate = today.year - dataframe['birth_date'].dt.year

# 위에서 구한 차와 나이가 동일한지 비교하기
compare = dataframe['age'] == age_calculate

# 이상이 없는 데이터와 이상이 있는 데이터를 나누어 저장
consistent = dataframe[compare]
inconsistent = dataframe[~compare]

결측치

  • 결측치는 3가지로 분류할 수 있다.

완전 무작위 결측 : 결측치가 다른 변수들과 전혀 관련이 없음.

무작위 결측 : 다른 변수와 관련되어 누락되었지만, 그 변수는 결과와 관련이 없음.

비 무작위 결측 : 결과와 관련이 있는 변수 때문에 값이 누락됨.

  • 결측치에 대해 탐색하기
# 각 column별로 결측치 수 집계하여 나타내기
print(dataframe[:].isna().sum())

# 각 column별 결측치 수를 시각화하여 나타내기
msno.matrix(dataframe)
plt.show()

# 결측치가 포함된 column을 파악 후 결측치와 비결측치를 구분하기
missing = dataframe[dataframe['column'].isna()]
non_missing = dataframe[~dataframe['column'].isna()]

# 결측 기준 파악 후 해당 기준으로 정렬하기
sorted = dataframe[:].sort_values('orderby')

# 정렬한 내용으로 다시 시각화하기
msno.matrix(sorted)
plt.show()
profile
https://www.rarebeef.co.kr/

0개의 댓글