본문 바로가기
IT,SW,Data,Cloud,코딩/Python

20230611 작업형1 모의문제1

by 착실하게 2023. 6. 11.
반응형

인프런에서 퇴근후딴짓 님의 빅데이터분석기사 실기시험 강의를 들으면서 메모해두기

 

 

 

import pandas as pd 

# 문제1 
# f1컬럼의 결측치는 중앙 값으로 대체 하고, 나머지 결측치가 있는 데이터(행)을 모두 제거 하고, 앞에서부터 70% 데이터 중 views 컬럼의 3사분위수에서 1사분위수를 뺀 값을 구하시오. 단, 데이터 70% 지점은 정수형 (int) 변환

mem = pd.read_csv('data/20/members.csv')

med = mem['f1'].median()
# print(mem.describe())
mem['f1']=mem['f1'].fillna(med)
# print(mem.isnull().sum())
# print(mem.shape)
mem=mem.dropna()
# print(mem.isnull().sum())
# print(mem.shape)
line = int(len(mem) * 0.7)
mem = mem[:line]
print(mem['views'].quantile(0.75) - mem['views'].quantile(0.25))
# 맞췄음 


###################################
# 문제2
# 주어진 데이터에서 결측치가 30% 이상 되는 컬럼을 찾고, 해당 컬럼에 결측치가 있는 데이터 (행) 을 삭제 함. 그리고 30% 미만, 20% 이상 결측치가 있는 컬럼은 최빈값으로 값을 대체 하고 'f3' 컬럼의 'gold' 값을 가진 데이터 수를 출력하세요. 
print("=================================")
mem = pd.read_csv('data/20/members.csv')

# print(len(mem)*0.3) # 30개 이상인 컬럼 찾으면 됨 
# print( mem.isnull().sum() ) # f1 컬럼임 # 맞았음. 그냥 눈으로 보고 f1이구나 적어두고 진행하는게 맞음. 
# 그리고 20개 이상 30개 미만인 컬럼은 f3 컬럼임 # 이때 f3 처리를 판단해두는거임. 
# print(mem.shape)
mem=mem.dropna(subset=['f1'])
# print(mem.shape)

# print(len(mem) * 0.2, len(mem) * 0.3 ) # 13.8 이상 20.7 미만 결측치가 있다면 <ㅡ 나는 이런식으로 그 다음에 한번더 했는데, 이렇게 하는게 아니라, 아까 맨처음에 했을때 28개 결측치 있어서 f3 이 20이상 30미만 기준에 들어간거임. 문제해석 유의하기! 


mod = mem['f3'].mode()[0]
# print(mod.iloc[:,1])
# print(mem.describe(include='object')) # gold 임을 확인함 
mem['f3'] = mem['f3'].fillna(mod)
# print( mem.isnull().sum() ) # 왜 안채워질까? # 강의를 보니까 이유가 약간 의심스럽던 그 부분 맞음. mod = mem['f3'].mode()[0] 이렇게 해야함. mod = mem['f3'].mode() 이렇게 하면 안됨. 

print(sum(mem['f3'] == 'gold'))
print(len(mem[mem['f3'] == 'gold']))

###################################
#문제3
# views 컬럼에 결측치가 있는 데이터 (행)을 삭제하고, f3 컬럼의 결측치는 0, silver 는 1 gold 는 2, vip 는 3 으로 변환한 후 총 합을 정수형으로 출력하시오. 
print("=================================")
mem = pd.read_csv('data/20/members.csv')

# print(mem.isnull().sum())
# print(mem.shape)
mem=mem.dropna(subset=['views'])
# print(mem.shape)
# print(mem.isnull().sum())
mem['f3']=mem['f3'].fillna(0)
# print(mem.isnull().sum())

####여기까지는 했는데 이 다음에는 어떻게 해야할지 모르겠음
# print(mem.head())
# print(mem['f3'].unique())

# for row in mem['f3']:
#   # print(row)
#   if row == 'gold':
#     row = 2 
#   elif row == 'silver':
#     row = 1
#   elif row == 'vip':
#     row = 3
#   mem['f3']=row

print(mem.head())
mem['f3']=mem['f3'].replace('gold',2)
mem['f3']=mem['f3'].replace('silver',1)
mem['f3']=mem['f3'].replace('vip',3)
print(mem.head())

#### 선생님코드 ####
# 방법 (1) replace 
# 결측값도 replace로 가능하다 
# 결측값은 numpy 의 np.nan 이다. 
# chaining 방식으로 적으면 왼쪽부터 순차적으로 실행 된다. 

mem = pd.read_csv('data/20/members.csv')
mem=mem.dropna(subset=['views'])
import numpy as np 
# print(mem.head(10))
mem['f3']=mem['f3'].replace(np.nan,0).replace('gold',2).replace('silver',1).replace('vip',3)
# print(mem.head(10))

print(mem['f3'].sum()) # 133 
print(sum(mem['f3'])) # 133 
# 이 두가지는 동일한 결과를 주었다. 


#### 선생님코드 ####
# 방법 (2) map 활용 - dictionary 사용 

mem = pd.read_csv('data/20/members.csv')
mem=mem.dropna(subset=['views'])
import numpy as np

# 딕셔너리 생성 
dict_list = {np.nan:0,'silver':1,'gold':2,'vip':3}

print(mem.head(10))
mem['f3'] =mem['f3'].map(dict_list)
print(mem.head(10))


print(mem['f3'].sum()) # 133 
print(sum(mem['f3'])) # 133 



#### 선생님코드 ####
# 방법 (3) 조건을 사용하는 ad_hoc 스타일 

mem = pd.read_csv('data/20/members.csv')
mem=mem.dropna(subset=['views'])

r1 = sum(mem['f3']=='silver') * 1
r2 = sum(mem['f3']=='gold') * 2
r3 = sum(mem['f3']=='vip') * 3

print(r1+r2+r3) # 133
반응형

댓글