// 퇴근후딴짓 님의 강의를 참고하였습니다. //
Dataset :
문제1)
- f1컬럼의 결측치는 중앙 값으로 대체하고,
- 나머지 결측치가 있는 데이터(행)을 모두 제거하고,
- 앞에서부터 70% 데이터 중 views 컬럼의 3사분위 수에서 1사분위 수를 뺀 값을 구하시오.
- (단, 데이터 70% 지점은 정수형(int) 변환)
import pandas as pd
df = pd.read_csv("members.csv")
print(df.isnull().sum())
df['f1'] = df['f1'].fillna(df['f1'].median())
print(df.isnull().sum())
실행 결과 :
id 0
age 0
city 0
f1 31
f2 0
f3 28
f4 0
f5 0
subscribed 0
views 4
dtype: int64
id 0
age 0
city 0
f1 0
f2 0
f3 28
f4 0
f5 0
subscribed 0
views 4
dtype: int64
→ f1 컬럼의 중앙값을 fillna()를 통해 결측치에 대입한 후 f1 컬럼의 결측치 숫자가 31 -> 0개로 된 것을 확인 할 수 있다.
print(df.shape)
df = df.dropna()
print(df.shape)
실행 결과 :
(100, 10)
(72, 10)
→ 결측치가 있는 행을 제거 한 후 행의 개수가 100개에서 72개로 줄어든 것을 확인 할 수 있다.
df = df[:int(len(df) * 0.7)]
r1 = df['views'].quantile(.75)
r2 = df['views'].quantile(.25)
print(r1 - r2)
실행 결과 :
3261.0
→ 70%의 데이터는 df의 전체 길이에 0.7을 곱하여 구한 후 3분위수와 1분위수는 .quantile()을 통해 구한 후 빼주면 3261.0이 나온다.
문제2)
- 주어진 데이터에서 결측치가 30%이상 되는 컬럼을 찾고 해당 컬럼에 결측치가 있는 데이터(행)를 삭제 함.
- 그리고 30% 미만, 20% 이상인 결측치가 있는 컬럼은 최빈값으로 값을 대체하고
- 'f3'컬럼의 'gold' 값을 가진 데이터 수를 출력하시오.
import pandas as pd
df = pd.read_csv("members.csv")
print(df.isnull().sum())
실행 결과 :
id 0
age 0
city 0
f1 31
f2 0
f3 28
f4 0
f5 0
subscribed 0
views 4
dtype: int64
print(len(df) * 0.3)
실행 결과 : 30
→ 결측치의 30% 이상인 컬럼은 f1, 20%이상 30%미만인 컬럼은 f3이다.
→ f1 컬럼에 결측치가 있는 행은 삭제, f3 컬럼은 최빈값으로 대체한다.
print(df.shape)
df = df.dropna(subset=['f1'])
print(df.shape)
실행 결과 :
(100, 10)
(69, 10)
→ f1 컬럼의 결측치가 있는 행을 삭제 후 행의 개수가 100 -> 69개로 줄어들었다.
print(df.head())
df['f3'] = df['f3'].fillna(df['f3'].mode()[0])
print(df.head())
실행 결과 :
id age city f1 f2 f3 f4 f5 subscribed views
1 id02 9.0 서울 70.0 1 NaN ENFJ 60.339826 2021-05-12 2534.0
2 id03 27.0 서울 61.0 1 gold ISTJ 17.252986 2021-03-16 7312.0
4 id05 24.0 서울 85.0 2 NaN ISFJ 29.269869 2021-03-07 1338.0
5 id06 22.0 서울 57.0 0 vip INTP 20.129444 2021-09-12 21550.0
6 id07 36.3 서울 60.0 1 NaN ISFJ 9.796378 2021-01-11 61.0
id age city f1 f2 f3 f4 f5 subscribed views
1 id02 9.0 서울 70.0 1 gold ENFJ 60.339826 2021-05-12 2534.0
2 id03 27.0 서울 61.0 1 gold ISTJ 17.252986 2021-03-16 7312.0
4 id05 24.0 서울 85.0 2 gold ISFJ 29.269869 2021-03-07 1338.0
5 id06 22.0 서울 57.0 0 vip INTP 20.129444 2021-09-12 21550.0
6 id07 36.3 서울 60.0 1 gold ISFJ 9.796378 2021-01-11 61.0
→ f3 컬럼의 결측치(NaN)를 최빈값인 gold로 대체한 것을 확인 할 수 있다.
print(sum(df['f3'] == 'gold'))
실행 결과 :
56
→ 마지막으로 f3 컬럼에 gold값을 가진 데이터수는 56개인 것을 확인 할 수 있다.
문제3)
- views 컬럼에 결측치가 있는 데이터(행)을 삭제하고,
- f3 컬럼의 결측치는 0, silver는 1, gold는 2, vip는 3 으로 변환한 후 총 합을 정수형으로 출력하시오.
import pandas as pd
df = pd.read_csv("members.csv")
# 방법1) replace
print(df.shape)
df = df.dropna(subset=['views'])
print(df.shape)
실행 결과 :
(100, 10)
(96, 10)
→ 첫번째 방법은 replace를 사용하는 방법이다
→ views 컬럼의 결측치 있는 행을 삭제한다.
print(df.head(7))
import numpy as np
df['f3'] = df['f3'].replace(np.nan,0).replace('silver',1).replace('gold',2).replace('vip',3)
print(df.head(7))
실행 결과 :
id age city f1 f2 f3 f4 f5 subscribed views
0 id01 2.0 서울 NaN 0 gold ENFJ 91.297791 2021-07-16 6820.0
1 id02 9.0 서울 70.0 1 NaN ENFJ 60.339826 2021-05-12 2534.0
2 id03 27.0 서울 61.0 1 gold ISTJ 17.252986 2021-03-16 7312.0
3 id04 75.0 서울 NaN 2 NaN INFP 52.667078 2021-07-21 493.0
4 id05 24.0 서울 85.0 2 NaN ISFJ 29.269869 2021-03-07 1338.0
5 id06 22.0 서울 57.0 0 vip INTP 20.129444 2021-09-12 21550.0
6 id07 36.3 서울 60.0 1 NaN ISFJ 9.796378 2021-01-11 61.0
id age city f1 f2 f3 f4 f5 subscribed views
0 id01 2.0 서울 NaN 0 2 ENFJ 91.297791 2021-07-16 6820.0
1 id02 9.0 서울 70.0 1 0 ENFJ 60.339826 2021-05-12 2534.0
2 id03 27.0 서울 61.0 1 2 ISTJ 17.252986 2021-03-16 7312.0
3 id04 75.0 서울 NaN 2 0 INFP 52.667078 2021-07-21 493.0
4 id05 24.0 서울 85.0 2 0 ISFJ 29.269869 2021-03-07 1338.0
5 id06 22.0 서울 57.0 0 3 INTP 20.129444 2021-09-12 21550.0
6 id07 36.3 서울 60.0 1 0 ISFJ 9.796378 2021-01-11 61.0
→ f3컬럼의 결측치 -> 0, silver -> 1, gold ->2, vip -> 3으로 대체한 것을 확인 할 수 있다.
print(df['f3'].sum())
실행 결과 :
133
→ 변환 후 f3 컬럼의 총 합은 133이다.
# 방법2) map
import pandas as pd
df = pd.read_csv("members.csv")
df = df.dropna(subset=['views'])
dict_list = {np.nan:0, 'silver':1, 'gold':2, 'vip':3}
df['f3'] = df['f3'].map(dict_list)
print(df['f3'].sum())
실행 결과 :
133
→ 두번째 방법은 map을 사용해 대체하는 방법이다. 결과는 133으로 같다.
# 방법3) 조건
import pandas as pd
df = pd.read_csv("members.csv")
df = df.dropna(subset=['views'])
r1 = sum(df['f3'] == 'silver') * 1
r2 = sum(df['f3'] == 'gold') * 2
r3 = sum(df['f3'] == 'vip') * 3
print(r1 + r2 + r3)
실행 결과 :
133
→ 세번째 방법은 replace나 map을 모르는경우 단순조건문을 통해 구하는 방법이다. 결과는 133으로 같다.
'빅데이터분석기사 > 작업형1' 카테고리의 다른 글
[작업형1] 평균 / 그룹합 / datetime 변환 구하기 (0) | 2023.06.17 |
---|---|
[작업형1] 결측치 대체 / 사분위수 / 표준편차 구하기 (0) | 2023.06.17 |
[작업형1] 결측치 / 사분위수 / 데이터 수 구하기 (0) | 2023.06.17 |
[작업형1] 대체 및 평균값 / 표준편차 / 이상치 구하기 (0) | 2023.06.15 |
[작업형1] 레코드(row) 수 구하기 (0) | 2023.06.15 |