[pandas] 데이터 전처리 – 파일 병합, 데이터프레임 수정, 중복 값 확인 및 제거

데이터 분석을 공부할 때는 매우 clean한 데이터들을 다루기 때문에 분석에만 집중할 수 있으나 현실 세계는 그리 녹록치 않다. 실제로 현업에 들어가면 매우 dirty한 데이터들만 마주하게 된다.

그래서 ‘데이터 분석’을 한다고 하면 뭔가 멋진 일을 하는 것처럼 보일 수도 있지만, 막상 분석가들이 하는 일을 보면 분석가들은 원본 데이터(raw data)를 받은 후 분석을 위해 데이터를 요리조리 만져서 준비하는 데에 시간과 노력을 쏟는다. 총 작업 시간을 따져보면 데이터 전처리에 80%를 쏟고, 실제로 분석을 하거나 분석 모델을 구축하는 데에는 20% 정도 밖에 시간을 안 쓴다는 얘기도 있다.

그래서 본 포스팅에서는 더티한 데이터를 받았을 때 어떻게 전처리하면 좋을지 방법을 간략히 남겨보고자 한다. (파이썬 pandas를 기준으로)

0. 데이터가 깨끗한지 빠르게 훑어보기

일단 데이터를 처음 받으면 행과 열을 기준으로 확인해야 한다.

  • 행: 관찰된 대상이 각각 1개의 행에 들어와 있는지
  • 열: 변수들이 각각 1개의 열에 할당되어 있는지

이걸 일단 빠르게 훑어보려면 아래와 같은 함수를 사용하면 된다.

  • df.head() — 처음 5행, 윗부분을 보여줌
  • df.info() — 표의 속성을 요약해줌
  • df.describe() — 기술 통계를 요약해줌
  • df.columns — 열 이름을 보여줌
  • df.value_counts() — 각 열에 어떤 변수들이 들어가 있는지 알려줌

2. 여러 파일에서 데이터 모으기 (glob)

종종 동일한 데이터가 여러 파일에 쪼개져 있는 경우가 있다. 예를 들면 ‘file1.csv’, ‘file2.csv’, ‘file3.csv’ 과 같은 식으로. 이럴 때 파이썬 라이브러리 glob를 사용하면 일종의 정규식을 활용해 문자 규칙이 일치하는 파일들을 다 찾아서 열 수 있다.

예를 들어 file이라는 이름으로 시작하고, 확장자가 csv인 파일을 모두 찾아서 데이터를 합치려면 이렇게 하면 된다.

import glob
import pandas as pd

files = glob.glob("file*.csv")

df_list = []
for filename in files:
  data = pd.read_csv(filename)
  df_list.append(data)

df = pd.concat(df_list)

3. 데이터 프레임 수정하기 (melt)

위에서 언급한 것처럼 분석을 위해서는 보통 각 행에 관찰된 값 하나가 들어오길 기대한다.

예를 들어 이런 데이터가 있는데,

아래와 같이 바꾸고 싶다고 해보자.

그럴 땐 pd.melt()를 사용해서 변형을 시킬 수 있다. melt가 녹인다는 뜻이니까… 뭐 데이터프레임을 실제로 녹여서 다시 변형시킨다고 생각하면 편하다.

어쨌든 코드는 이렇게 작성하면 된다. 헷갈릴 수 있으니 꼭 직접 해봐야 한다!

pd.melt(frame=df, id_vars='name', value_vars=['Checking','Savings'], value_name="Amount", var_name="Account Type")

코드를 실행하면 열 이름이 기본적으로 생성되긴 하지만, 보통 열 이름은 다시 직접 새로 부여해주는 게 편하다.

df.columns(["Account", "Account Type", "Amount"])

4. 중복 행 확인하고(.duplicated()) 제거하기(.drop_duplicates())

만약 이런 데이터프레임이 있는데, 중복된 행을 찾고 싶다고 해보자.

df.duplicated()라고 호출하면 아래와 같은 테이블을 얻을 수 있다. 만약 몇 개가 중복인지 확인하려면 df.duplicated().value_counts() 라고 써주면 되겠다.

2번 행이 중복됐다고 뜨는 걸 알 수 있다. “apple”, “$0.75”, “95” 로 1번 행과 완전히 똑같다.

중복된 행을 삭제하고 싶으면 df.drop_duplicates()라고 써주면 된다.

그런데 그 아래 있는 행은 price만 다르고 item과 calories는 “peach”, “55”로 동일하다. 만약 이렇게 특정 열에 대해 중복 여부를 판단해 삭제하고 싶다면 subset을 지정하면 된다.

예를 들어 item 열에서 중복을 찾아 삭제하고 싶다면 이런 식으로.

df = df.drop_duplicates(subset=['item'])

그러면 이렇게 아래 있던 peach 행이 삭제된 걸 볼 수 있다.

일단 오늘은 여기까지.

추천 글


댓글 남기기