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: 집계방식
df.columns[:3] -> ['상품군별(1)', '상품군별(2)', '운영형태별(1)']
df2 = df.melt(id_vars = df.columns[:3]
, var_name = '날짜'
, value_name = '거래액')
pivot_table 공부df2.pivot_table(index = ['상품군별(1)', '상품군별(2)', '운영형태별(1)', '날짜'])
df.info()로 확인해보니 모든 Dtype이 object# 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)
index = False : 인덱스을 없애주고 저장