[Ch1] 데이터 재구조화

jayce·2024년 7월 1일

데이터의 문제점

  • 이미 집계가 완료된 형태
  • 총합, 중간 집계값 존재
  • 가전,전자,통신기기 카테고리 세분화
  • 날짜 컬럼 양식 불일치

준비


데이터 불러오기

import pandas as pd
# 한글 encoding이 필요한 데이터셋 - 주로 utf-8, utf-8-sig, cp949
df = pd.read_csv('1_온라인쇼핑몰 운영형태별 상품군별거래액.csv', encoding = 'cp949')

데이터 살펴보기

# 데이터가 잘 불러와졌는지 확인
df.head()

# 데이터 정보확인 (행,렬, dtype, null값...)
df.info()

# 괄호안에 숫자를 넣어서 특정열을 확인
df.columns[]

# 특정열의 유니크한 값 확인
df[df.columns[]].unique()

# 조건에 해당하는 열의 정보만을 확인
df[df["열이름"]==조건]

집계가 완료된 형태 > 재구조화를 위한 메서드를 적용


pd.melt()

  • df.melt()형태로도 가능
  • 이미 집계가 완료된 형태를 우리가 원하는 방식으로 바꾸기 위한 과정
  • 가로로 나열되어 있는 데이터를 세로로 나열되게 해줌
pd.melt(data, id_vars="", value_vars ="", var_name="", value_name="")
df.melt(id_vars="", value_vars ="", var_name="", value_name="")
  • id_vars : 유지할 컬럼
  • value_vars : 변환할 컬럼
  • var_name : 변환 후 생성되는 컬럼 이름
  • value_name : 변환 후 생성되는 값 컬럼의 이름

pd.pivot_table()

  • df.pivot_table()형태로도 가능
  • 세로로 나열되어 있는 데이터를 가로로 나열되게 해줌
pd.pivot_table(data, values="", index ="", columns="", aggfunc="")
  • values : 집계값
  • index : 집계기준 (행)
  • columns : 집계기준 (열)
  • aggfunc : 집계방식

재구조화를 위한 메서드 - melt 이용

df.columns[:3] -> ['상품군별(1)', '상품군별(2)', '운영형태별(1)']
df2 = df.melt(id_vars = df.columns[:3]
              , var_name = '날짜'
              , value_name = '거래액')

pivot_table 실습

  • 이 데이터의 문제점 해결은 아니지만 pivot_table 공부
df2.pivot_table(index = ['상품군별(1)', '상품군별(2)', '운영형태별(1)', '날짜'])
  • 위의 코드를 실행했더니 numeric이 아니라는 오류 코드가 떴다.
    -> df.info()로 확인해보니 모든 Dtypeobject
  • 아래 코드처럼 거래액 데이터만 어떤 형식인지 확인가능
# 1) list comprehension : 리스트를 빠르고 간결하게 만드는 비결
# 2) set = 파이썬 자료형의 하나로, 중복을 제거한 집합
# list에 set을 씌우면 unique값만 간편하게 확인할 수 있음

set([type(i) for i in df2["거래액"]])

문자열을 정수로 변경하는 함수 선언

#문자열 -> 정수

def strtoint(x) :

    if type(x) == str :           # type이 string이면
        x = x.replace("-", "0")   # - 를 0으로 바꿈 (참고. replace는 string에 적용되는 함수로, 바로 int로 바꿀 수는 없음!)
        x = int(x)                # int로 바꿈

    else :                        # 그 외의 type은 이미 Int이므로 pass
        pass

    return x
    
df2["거래액"] = df2["거래액"].apply(strtoint)  # apply는 series에 일괄적으로 함수를 적용시킴

다시 pivot_table 실행

# 상품군별을 행, 날짜를 열 별로 거래액의 평균을 계산하여 피벗 테이블 생성
df2.pivot_table(values = "거래액"
               , index = '상품군별(1)'
               , columns = '날짜'
               , aggfunc = 'mean')
               
# 상품군별(1), 상품군별(2)의 행를 사용하여 거래액의 평균을 계산하는 피벗 테이블 생성
df2.pivot_table(values="거래액",          
                index=['상품군별(1)', '상품군별(2)'])

# 상품군별을 행, 날짜를 열 별로 거래액의 합을 계산하여 피벗 테이블 생성
df2.pivot_table(values = "거래액"
               ,index = '상품군별(1)'
               , columns = '날짜'
               , aggfunc = 'sum')

총합, 중간 집계값 존재


# 상품군별(1)에서 합계 제외
df2 = df2[df2["상품군별(1)"] != "합계"]
df2[df2.columns[0]].unique() #총합계가 없어짐을 확인

# 운형형태별(1)에서 계 제외 (중간집계 뺴기)
df2 = df2[df2["운영형태별(1)"] != "계"]
df2[df2.columns[2]].unique() #운영형태의 합계도 없어짐을 확인

가전,전자 통신기기 카테고리 세분화


# 가전, 전자, 통신기기 세부 구분빼기 -> 소계만 남기면 됨!!
# 다른 카테고리와 맞추려면 세부 구분이 없어지면 되겠죠?

# 상품군별(2)에서 소계만 남기기
df2 = df2[df2["상품군별(2)"] == "소계"]
df2[df2.columns[1]].unique() # 소계만 남음!

# 세부 구분을 빼면, 이 값은 '소계'만 남기 때문에 무의미. 컬럼을 빼자.
# 컬럼명을 기준으로 axis=0 은 행, axis=1은 열을 삭제 (default는 0)
df2.drop("상품군별(2)", axis = 1, inplace = True)

날짜 컬럼 양식 불일치


일부 날짜 컬럼에 " p"가 붙어있는 것을 확인함

# " p"를 없애기
df2['날짜'] = df2['날짜'].apply(lambda x : x.replace(" p)", ""))

# /로 바꾸기
df2['날짜'] = df2['날짜'].apply(lambda x : x.replace(".", "/"))
  • apply : 컬럼에 함수 적용
  • lambda : 함수를 def를 이용해 작성하지 않아도 변경 가능
  • replace : string 타입 변경

저장하기


df2.to_csv("preprocess.csv", encoding = 'cp949', index = False)
  • 저장할때도 encoding이 필요
  • index = False : 인덱스을 없애주고 저장
    만약 설정 안해주면 인덱스가 새로운 컬럼으로 저장됨

0개의 댓글