#데이터 분석을 위한 데이터 전처리 과정
(6) 데이터 재구조화 1 : melt
df.info()
데이터 타입과 Null 값 확인을 많이 하게 된다.
non-null : 혹시 null값 있다면 처리를 해줘야 한다.
Dtype : 확인 해줘야 한다.
컬럼에 날짜가 들어가 있는데 Object로 돼 있기 때문에 데이터 값을 변화시켜 줘야 한다.
df.columns
이렇게 하면 컬럼만 모아서 확인 할 수 있다.
df.columns[0]
첫번째 컬럼만 확인할 경우 사용한다.
컬럼명 정확히 입력해줘야 에러 나지 않기 때문에 인덱스 방식으로 직접 가져오는 방식 노하우다.
cf) 구분
df.columns[0] = '상품군별(1)'
df[df.columns[0]] = 상품군별(1) 에 해당하는 데이터 값을 가지고 올 수 있다.
df[df.columns[0]].unique()
상품군별(1)에 들어있는 중복되지 않는 값만 가지고 올 수 있다.
df[df.columns[2]].unique() 이것도 같다.
#melt
df.melt() => 모든 df 값이 세로로 길게 나온다.
행이 6,240개 나온다. 가로로 있는 것도 세로로 바꿔준거래.
df.melt("상품군별(1)")
상품군별(1) 빼고 나머지는 오른쪽으로 펴진다.
len(df) #78개가 나온다.
melt는 어떤 컬럼을 남길지 설정해주면 나머지 컬럼을 세로로 길게 펴준다.
df.head(5) 로 df보면, 상품군별, 운영형태별은 집계 기준으로 사용할 수 있고,(남겨두고)
오른쪽에 있는 기간은 피봇 테이블로 세로로 펴줘야 한다는 것을 알 수 있다.
다시,
df.columns 해서 남길(사용할 컬럼) df 알 수 있다.
df.columns[ :3] 해서 3개 컬럼 남겨둔다. ['상품군별(1)', '상품군별(2)', '운영형태별(1)'] 이렇게 3개 결과 나온다.
df.melt(id_vars = df.columns[ :3]) 3개 값은 살아남고 그 외 값이 melt로 펴지게 된다.
(7) 데이터 재구조화 2 : pivot_table
pivot table : 세로로 긴 테이터 프레임 형태를 요약한 형태로 집계해서 나타낸다.
사용할 수 있는 옵션
index(행), columns(열) 지정할 수 있다.
수업 자료 경우, "거래액"이 숫자가 아니라 object 형태로 되있는데,
이것을 파이썬 문법 list comprehension 사용할거다.
pivot["거래액"]
for i in pivot["거래액"] : pivot 거래액 컬럼에 있는 컬럼 하나하나를 가져오겠다는 것.
[type(i) for i in pivot["거래액"]] : [] 대괄호는 리스트를 의미함.
=> 이 때 str, 으로 나타난다.
set([type(i) for i in pivot["거래액"]]) : set은 일종 집합형으로 만들어주는 함수
=> 중복을 제거한 유니크 값만 남게 된다.
=> 결과 : {int, str}
숫자형으로 보인 거래액 컬럼이 문자와 숫자가 뒤섞여 있더라.
한번더 list comprehension 문법 사용.
[i for i in pivot["거래액"] : pivot 거래액 안에 있는 값 하나씩 가져와서 나열해주는 list comprehesion이 된다. 이 결과가 '-'로 나오는 게 있다.
[i for i in df2["거래액"] if type(i) != int] : pivot 거래액 안에 있는 값 하나씩 가져오는데, int 값이 아닌 것 sorting 된다. 필터링
=> 숫자에 ' ' 있다. 이것은 숫자로 보이지만 문자다.
df.head() 를 통해 원본 데이터로 보겠다.
그래서 df[df["2017.01"]] == '-'] 로 빈값을 확인했다.
그래서 reslut.head()로 나온 거래액이 숫자로 생각했는데 아니었다는 것을 알 수 있다.
이제는 어떻게 숫자로 바꿀 수 있을지 처리하는 것을 보자.
(8) List_Comprehension 1
단 한줄의 코드로 특정 컬럼 데이터 타입이 숫자, 문자인지 판단할지를 알 수 있었다.
이번에는 파이썬 List Comprehesion 문법 소개한다.
파이썬 문법에서 볼 수 있는 특이한 문법이다.
반복문(for문)과 유사해 보인다.
[i * 2 for i in range(1, 11)]에서
for i in range(1, 11) : 이걸 내가 몇번 실행할지, 사용할 변수는 i
앞에 i *2 는 내가 변수 i로 무엇을 할지 지정해 주는 것.
예시)
[i * i for i in range(1, 11)][i * 2 - 1 for i in range(1, 11)]
[i % 2 for i in range(1, 11)] : %는 나눴을 때 나머지를 프린트 하는 것.
중복 값 제외하고 싶다면 set을 씌우는 것 만으로 어떤 유니크 값 볼 수 있다.
set([i % 2 for i in range(1, 11)])
(9) List_Comprehension 2
if문 결합해서 우리에게 필요한 값만을 불러올 수 있다.
[i for i in range(0, 20)]
이렇게 하면 [0, 1, 2, ... 19] 이렇게 나오지.
list comprehension 사용하지 않고 만들면 복잡하다. for문과 if문 으로.
test = []
for i in range(0, 20) :
if i % 2 == 1 :
test.append(i)
이 코드가 아래것과 같다.
[i for i in range(0, 20) if i % 2 == 1 ]
간편하다는 것은 인정한다. 얼마나 유용한지는?
30일 간의 일간 매출이 있는 리스트다.
import randaom 모듈 불러오기
랜덤 숫자 가지고 오는 것.
random.randint(1500, 4500) : 1,500부터 4,500사이의 인수를 무작위로 추출
random.randint(1500, 4500) for i in range(0, 30)
sales = [random.randint(1500, 4500) for i in range(0, 30)] 이렇게 하면 숫자 리스트가 나온다.
여기서 일간 매출 중 평균 매출 이상을 찾아내보자.
sum(sales) : 리스트 전체의 합
len(sales) : 리스트의 길이
print(avg)
avg = sum(sales) / len(sales) # 리스트의 평균
print(avg)
[i for i in sales if i > avg] : 평균을 넘어서는 값만 도출했다.
list comprehesnsion 은 if 뿐 아니라 else 도 반영할 수 있다.
['매출 달성' if i > avg else '매출 목표 미달' for i in sales]

Q. 왜 일반 숫자를 넣지 않고 "0" 문자열로 표시한 숫자를 넣냐?
답=> replace는 문자열에 적용하는 함수이고, 데이터 타입을 바꾸는 함수가 아니기 때문에 문자열로 표시한 숫자를 넣는다.