import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
df = pd.read_csv('mtcars.csv')
df.head()
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Q1. mpg 변수를 제 1사분위수를 구하고 정수값으로 출력하시오
Q1 = df['mpg'].quantile(.25)
print(round(Q1))
15
Q2. mpg 값이 19 이상 21 이하인 데이터 수를 구하시오
Q2 = df.loc[df['mpg'].between(19,21)]
Q2
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
9 | Merc 280 | 19.2 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.30 | 1 | 0 | 4 | 4 |
24 | Pontiac Firebird | 19.2 | 8 | 400.0 | 175 | 3.08 | 3.845 | 17.05 | 0 | 0 | 3 | 2 |
29 | Ferrari Dino | 19.7 | 6 | 145.0 | 175 | 3.62 | 2.770 | 15.50 | 0 | 1 | 5 | 6 |
print(len(Q2))
print(Q2.shape[0])
5 5
Q3. hp 변수의 IQR 값을 구하시오
Q1 = df['hp'].quantile(.25)
Q3 = df['hp'].quantile(.75)
print(Q3 - Q1)
83.5
Q4. wt 변수의 상위 10개 값의 총합을 구하여 소수점을 버리고 정수로 출력하시오
top10 = df.sort_values('wt', ascending = False).head(10)
top10
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
15 | Lincoln Continental | 10.4 | 8 | 460.0 | 215 | 3.00 | 5.424 | 17.82 | 0 | 0 | 3 | 4 |
16 | Chrysler Imperial | 14.7 | 8 | 440.0 | 230 | 3.23 | 5.345 | 17.42 | 0 | 0 | 3 | 4 |
14 | Cadillac Fleetwood | 10.4 | 8 | 472.0 | 205 | 2.93 | 5.250 | 17.98 | 0 | 0 | 3 | 4 |
11 | Merc 450SE | 16.4 | 8 | 275.8 | 180 | 3.07 | 4.070 | 17.40 | 0 | 0 | 3 | 3 |
24 | Pontiac Firebird | 19.2 | 8 | 400.0 | 175 | 3.08 | 3.845 | 17.05 | 0 | 0 | 3 | 2 |
23 | Camaro Z28 | 13.3 | 8 | 350.0 | 245 | 3.73 | 3.840 | 15.41 | 0 | 0 | 3 | 4 |
13 | Merc 450SLC | 15.2 | 8 | 275.8 | 180 | 3.07 | 3.780 | 18.00 | 0 | 0 | 3 | 3 |
12 | Merc 450SL | 17.3 | 8 | 275.8 | 180 | 3.07 | 3.730 | 17.60 | 0 | 0 | 3 | 3 |
30 | Maserati Bora | 15.0 | 8 | 301.0 | 335 | 3.54 | 3.570 | 14.60 | 0 | 1 | 5 | 8 |
6 | Duster 360 | 14.3 | 8 | 360.0 | 245 | 3.21 | 3.570 | 15.84 | 0 | 0 | 3 | 4 |
int(sum(top10['wt'])) #반올림이 아닌 버림
42
Q5. 전체 자동차에서 cyl가 6인 비율이 얼마인지 소수점 첫재짜리까지 출력하시오
print(round((len(df.loc[df['cyl'] == 6]) / len(df)),1))
0.2
Q6. 첫번째행부터 순서대로 10개를 뽑은 후 mpg 열의 평균값을 반올림하여 정수로 출력하시오
df1 = df.head(10)
df1
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
5 | Valiant | 18.1 | 6 | 225.0 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
6 | Duster 360 | 14.3 | 8 | 360.0 | 245 | 3.21 | 3.570 | 15.84 | 0 | 0 | 3 | 4 |
7 | Merc 240D | 24.4 | 4 | 146.7 | 62 | 3.69 | 3.190 | 20.00 | 1 | 0 | 4 | 2 |
8 | Merc 230 | 22.8 | 4 | 140.8 | 95 | 3.92 | 3.150 | 22.90 | 1 | 0 | 4 | 2 |
9 | Merc 280 | 19.2 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.30 | 1 | 0 | 4 | 4 |
df.iloc[ : 10]
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
5 | Valiant | 18.1 | 6 | 225.0 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
6 | Duster 360 | 14.3 | 8 | 360.0 | 245 | 3.21 | 3.570 | 15.84 | 0 | 0 | 3 | 4 |
7 | Merc 240D | 24.4 | 4 | 146.7 | 62 | 3.69 | 3.190 | 20.00 | 1 | 0 | 4 | 2 |
8 | Merc 230 | 22.8 | 4 | 140.8 | 95 | 3.92 | 3.150 | 22.90 | 1 | 0 | 4 | 2 |
9 | Merc 280 | 19.2 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.30 | 1 | 0 | 4 | 4 |
df1['mpg'].mean().round(1)
20.4
Q7. 첫번째 행부터 순서대로 50%까지 데이터를 뽑아 wt 변수의 중앙값을 구하시오
df.shape
(32, 12)
r50 = int(len(df)*0.5)
df.iloc[ : r50]
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
5 | Valiant | 18.1 | 6 | 225.0 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
6 | Duster 360 | 14.3 | 8 | 360.0 | 245 | 3.21 | 3.570 | 15.84 | 0 | 0 | 3 | 4 |
7 | Merc 240D | 24.4 | 4 | 146.7 | 62 | 3.69 | 3.190 | 20.00 | 1 | 0 | 4 | 2 |
8 | Merc 230 | 22.8 | 4 | 140.8 | 95 | 3.92 | 3.150 | 22.90 | 1 | 0 | 4 | 2 |
9 | Merc 280 | 19.2 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.30 | 1 | 0 | 4 | 4 |
10 | Merc 280C | 17.8 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.90 | 1 | 0 | 4 | 4 |
11 | Merc 450SE | 16.4 | 8 | 275.8 | 180 | 3.07 | 4.070 | 17.40 | 0 | 0 | 3 | 3 |
12 | Merc 450SL | 17.3 | 8 | 275.8 | 180 | 3.07 | 3.730 | 17.60 | 0 | 0 | 3 | 3 |
13 | Merc 450SLC | 15.2 | 8 | 275.8 | 180 | 3.07 | 3.780 | 18.00 | 0 | 0 | 3 | 3 |
14 | Cadillac Fleetwood | 10.4 | 8 | 472.0 | 205 | 2.93 | 5.250 | 17.98 | 0 | 0 | 3 | 4 |
15 | Lincoln Continental | 10.4 | 8 | 460.0 | 215 | 3.00 | 5.424 | 17.82 | 0 | 0 | 3 | 4 |
df50 = df.iloc[ : r50]
df50['wt'].median()
3.44
Q8.결측값이 있는 데이터의 수를 구하시오
df.isnull().sum()
model 0 mpg 0 cyl 0 disp 0 hp 0 drat 0 wt 0 qsec 0 vs 0 am 0 gear 0 carb 0 dtype: int64
print(df.isnull().sum().sum())
0
Q9. '판매수' 컬럼의 결측값을 판매수의 중앙값으로 대체하고 판매수의 평균값을 정수로 출력하시오
df = pd.DataFrame({
'날짜' : ['20220103','20220105', None, '20230127', '20220203', '20220205','20230210', '20230223','20230312','20220217','20220217','20220217']
,'제품' : ['A','B', None, 'B','A',None, 'A','B','A','B','A','A']
,'판매수' : [3, None, 5, 10, 10, 10, 15, 15, 20, None, 30, 40]
,'개당수익' : [300, 400, 500, 600, 400 ,500, 500, 600, 600, 700, 600, 600]
})
Q2 = df['판매수'].median()
print(Q2)
12.5
df['판매수'] = df['판매수'].fillna(Q2)
print(round(df['판매수'].mean()))
15
Q10. 판매수 컬럼에 결측치가 있는 행을 제거하고,
첫번째 행부터 순서대로 50%까지의 데이터를 추출하여
판매수 변수의 Q1 값을 정수로 출력하시오
df = pd.DataFrame({
'날짜' : ['20220103','20220105', None, '20230127', '20220203', '20220205','20230210', '20230223','20230312','20220217','20220217','20220217']
,'제품' : ['A','B', None, 'B','A',None, 'A','B','A','B','A','A']
,'판매수' : [3, None, 5, 10, 10, 10, 15, 15, 20, None, 30, 40]
,'개당수익' : [300, 400, 500, 600, 400 ,500, 500, 600, 600, 700, 600, 600]
})
df = df.dropna(subset = '판매수')
p50 = int(len(df)*0.5)
p50
5
df['판매수'][ : 50].quantile(0.25)
10.0
Q11. mtcars 데이터에서 cyl이 4인 자동차와 6인 자동차 그룹의 mpg 평균값 차이를 절대값으로 정수로 출력하시오
df = pd.read_csv('mtcars.csv')
df.head()
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
cyl4 = df.loc[df['cyl'] == 4]
cyl6 = df.loc[df['cyl'] == 6]
print(cyl4['mpg'].mean())
print(cyl6['mpg'].mean())
26.66363636363636 19.74285714285714
print(round(abs(cyl4['mpg'].mean() - cyl6['mpg'].mean())))
7
print(int(abs(cyl4['mpg'].mean() - cyl6['mpg'].mean())))
6
Q12. hp 변수에 대해 데이터 표준화(Z-score)를 진행하고, 이상치의 수를 구하시오
(단, 이상치는 Z 값이 1.5를 초과하거나 -1.5 미만인 값이다)
Z = (X - 평균)/ 표준편차
mean = df['hp'].mean()
std = df['hp'].std()
df['zcore'] = (df['hp'] - mean) / std
df[['hp', 'zcore']].head()
hp | zcore | |
---|---|---|
0 | 110 | -0.535093 |
1 | 110 | -0.535093 |
2 | 93 | -0.783040 |
3 | 110 | -0.535093 |
4 | 175 | 0.412942 |
len(df.loc[(df['zcore'] < -1.5) | (df['zcore'] > 1.5)])
2
Q13. mpg 컬럼을 최소최대 Scaling을 진행한 수 0.7보다 큰 값을 가지는 레코드 수를 구하라
(x - min) / (max - min)
#방식1
df['mpg_Scaling'] = MinMaxScaler().fit_transform(df[['mpg']])
df.head()
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | zcore | mpg_Scaling | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 | -0.535093 | 0.451064 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 | -0.535093 | 0.451064 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 | -0.783040 | 0.527660 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 | -0.535093 | 0.468085 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 | 0.412942 | 0.353191 |
print(len(df.loc[ df['mpg_Scaling'] > 0.7]))
5
#방식2
min_mpg = df['mpg'].min()
max_mpg = df['mpg'].max()
df['mpg_scaling2'] = ( df['mpg'] - min_mpg) / (max_mpg - min_mpg)
df.head()
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | zcore | mpg_Scaling | mpg_scaling2 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 | -0.535093 | 0.451064 | 0.451064 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 | -0.535093 | 0.451064 | 0.451064 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 | -0.783040 | 0.527660 | 0.527660 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 | -0.535093 | 0.468085 | 0.468085 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 | 0.412942 | 0.353191 | 0.353191 |
print(len(df.loc[ df['mpg_scaling2'] > 0.7]))
5
Q14. wt 컬럼에 대해 상자그림 기준으로 이상치의 개수를 구하시오
outlier : IQR * 1.5 이상
df = pd.read_csv('mtcars.csv')
df.head()
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Q1 = df['wt'].quantile(0.25)
Q3 = df['wt'].quantile(0.75)
IRQ = Q3 -Q1
upper = Q3 + 1.5 * IRQ
lower = Q1 - 1.5 * IRQ
print(len(df.loc[(df['wt'] < lower) | (df['wt'] > upper)]))
3
Q15. 판매수 컬럼의 결측치를 최소값으로 대체하고, 결측치가 있을 때와 최소값으로 대체했을 때 평균값의 차이를 절대값으로 정수형태로 출력해라
df = pd.DataFrame({
'날짜' : ['20220103','20220105', None, '20230127', '20220203', '20220205','20230210', '20230223','20230312','20230422','20220505','20230511']['20220103','20220105', None, '20230127', '20220203', '20220205','20230210', '20230223','20230312','20220217','20220217','20220217']
,'제품' : ['A','B', None, 'B','A',None, 'A','B','A','B','A','A']
,'판매수' : [3, None, 5, 10, 10, 10, 15, 15, 20, None, 30, 40]
,'개당수익' : [300, 400, 500, 600, 400 ,500, 500, 600, 600, 700, 600, 600]
})
df['판매수'].fillna(df['판매수'].min()).mean()
13.666666666666666
df['판매수'].mean()
15.8
int(abs(df['판매수'].mean() - df['판매수'].fillna(df['판매수'].min()).mean()))
2
Q16. vs 변수가 0이 아닌 차량 중에서 mpg 값이 가장 큰 차량의 hp 값을 출력하시오.
df = pd.read_csv('mtcars.csv')
df.head()
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
df.loc[(df['vs'] != 0)].sort_values('mpg', ascending = False)['hp'].iloc[0]
65
Q17. gear 변수값이 3,4인 두 그룹의 hp 표준편차 값의 차이를 절대값으로 소수점 첫째자리 수로 출력하시오.
print(df.loc[df['gear'] == 3]['hp'].std())
print(df.loc[df['gear'] == 4]['hp'].std())
47.68927202911223 25.893137033865663
print(round(abs(df.loc[df['gear'] == 3]['hp'].std() - df.loc[df['gear'] == 4]['hp'].std()),1))
21.8
Q18. gear 변수의 값별로 그룹화하여 mpg 평균값을 산출하고, 평균값이 높은 그룹의 mpg 제 3분위수 값을 구하시오.
df.head()
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
df1 = df[['gear','mpg']]
df1.groupby('gear').agg(['mean','sum','min','max'])
mpg | ||||
---|---|---|---|---|
mean | sum | min | max | |
gear | ||||
3 | 16.106667 | 241.6 | 10.4 | 21.5 |
4 | 24.533333 | 294.4 | 17.8 | 33.9 |
5 | 21.380000 | 106.9 | 15.0 | 30.4 |
df.loc[(df['gear'] == 4)]['mpg'].quantile(0.75)
28.075
Q19. hp 항목의 상위 7번째 값으로 상위 7개 값을 변환한 후, hp가 150이상인 데이터를 추출하여 hp의 평균값을 반올림하여 정수로 출력하시오
df = pd.read_csv('mtcars.csv')
df.head()
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
#hp 기준으로 내림차순 정렬
df = df.sort_values('hp', ascending = False)
df.head()
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
30 | Maserati Bora | 15.0 | 8 | 301.0 | 335 | 3.54 | 3.570 | 14.60 | 0 | 1 | 5 | 8 |
28 | Ford Pantera L | 15.8 | 8 | 351.0 | 264 | 4.22 | 3.170 | 14.50 | 0 | 1 | 5 | 4 |
6 | Duster 360 | 14.3 | 8 | 360.0 | 245 | 3.21 | 3.570 | 15.84 | 0 | 0 | 3 | 4 |
23 | Camaro Z28 | 13.3 | 8 | 350.0 | 245 | 3.73 | 3.840 | 15.41 | 0 | 0 | 3 | 4 |
16 | Chrysler Imperial | 14.7 | 8 | 440.0 | 230 | 3.23 | 5.345 | 17.42 | 0 | 0 | 3 | 4 |
df = df.reset_index(drop = True)
df['hp'].loc[6]
205
#np.where 활용 : np.where(조건, true 일때 결과값, false 일때 결과값)
df['hp'] = np.where(df['hp']>=205, df['hp'].loc[6], df['hp'])
print(round(df.loc[df['hp'] >= 150]['hp'].mean()))
187
Q20. model 변수에 Merc 문구가 포홤된 자동차의 mpg 평균값을 정수로 출력하시오
df = pd.read_csv('mtcars.csv')
df.head()
model | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
1 | Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
2 | Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
3 | Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
4 | Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
round(df.loc[df['model'].str.contains('Merc')]['mpg'].mean())
19
Q21. '22년 1분기 메출액을 구하시오
df = pd.DataFrame({
'날짜' : ['20220103','20220105', '20230105', '20230127', '20220203', '20220205','20230210', '20230223','20230312','20230422','20220505','20230511']
,'제품' : ['A','B', 'A', 'B','A','B', 'A','B','A','B','A','A']
,'판매수' : [3, 5, 5, 10, 10, 10, 15, 15, 20, 25, 30, 40]
,'개당수익' : [300, 400, 500, 600, 400 ,500, 500, 600, 600, 700, 600, 600]
})
df
날짜 | 제품 | 판매수 | 개당수익 | |
---|---|---|---|---|
0 | 20220103 | A | 3 | 300 |
1 | 20220105 | B | 5 | 400 |
2 | 20230105 | A | 5 | 500 |
3 | 20230127 | B | 10 | 600 |
4 | 20220203 | A | 10 | 400 |
5 | 20220205 | B | 10 | 500 |
6 | 20230210 | A | 15 | 500 |
7 | 20230223 | B | 15 | 600 |
8 | 20230312 | A | 20 | 600 |
9 | 20230422 | B | 25 | 700 |
10 | 20220505 | A | 30 | 600 |
11 | 20230511 | A | 40 | 600 |
df['new_date'] = pd.to_datetime(df['날짜'])
df
날짜 | 제품 | 판매수 | 개당수익 | new_date | |
---|---|---|---|---|---|
0 | 20220103 | A | 3 | 300 | 2022-01-03 |
1 | 20220105 | B | 5 | 400 | 2022-01-05 |
2 | 20230105 | A | 5 | 500 | 2023-01-05 |
3 | 20230127 | B | 10 | 600 | 2023-01-27 |
4 | 20220203 | A | 10 | 400 | 2022-02-03 |
5 | 20220205 | B | 10 | 500 | 2022-02-05 |
6 | 20230210 | A | 15 | 500 | 2023-02-10 |
7 | 20230223 | B | 15 | 600 | 2023-02-23 |
8 | 20230312 | A | 20 | 600 | 2023-03-12 |
9 | 20230422 | B | 25 | 700 | 2023-04-22 |
10 | 20220505 | A | 30 | 600 | 2022-05-05 |
11 | 20230511 | A | 40 | 600 | 2023-05-11 |
df['new_date'].dt.year
0 2022 1 2022 2 2023 3 2023 4 2022 5 2022 6 2023 7 2023 8 2023 9 2023 10 2022 11 2023 Name: new_date, dtype: int32
df1 = df.loc[(df['new_date'].dt.year == 2022) & (df['new_date'].dt.quarter == 1)]
df1
날짜 | 제품 | 판매수 | 개당수익 | new_date | |
---|---|---|---|---|---|
0 | 20220103 | A | 3 | 300 | 2022-01-03 |
1 | 20220105 | B | 5 | 400 | 2022-01-05 |
4 | 20220203 | A | 10 | 400 | 2022-02-03 |
5 | 20220205 | B | 10 | 500 | 2022-02-05 |
(df1['판매수']*df1['개당수익']).sum()
11900
Q22. '22년과 '23년의 총 매출액 차이를 절대값으로 구하시오.
df = pd.DataFrame({
'날짜' : ['20220103','20220105', '20230105', '20230127', '20220203', '20220205','20230210', '20230223','20230312','20230422','20220505','20230511']
,'제품' : ['A','B', 'A', 'B','A','B', 'A','B','A','B','A','A']
,'판매수' : [3, 5, 5, 10, 10, 10, 15, 15, 20, 25, 30, 40]
,'개당수익' : [300, 400, 500, 600, 400 ,500, 500, 600, 600, 700, 600, 600]
})
df
날짜 | 제품 | 판매수 | 개당수익 | |
---|---|---|---|---|
0 | 20220103 | A | 3 | 300 |
1 | 20220105 | B | 5 | 400 |
2 | 20230105 | A | 5 | 500 |
3 | 20230127 | B | 10 | 600 |
4 | 20220203 | A | 10 | 400 |
5 | 20220205 | B | 10 | 500 |
6 | 20230210 | A | 15 | 500 |
7 | 20230223 | B | 15 | 600 |
8 | 20230312 | A | 20 | 600 |
9 | 20230422 | B | 25 | 700 |
10 | 20220505 | A | 30 | 600 |
11 | 20230511 | A | 40 | 600 |
df['총매출액'] = df['판매수'] * df['개당수익']
df
날짜 | 제품 | 판매수 | 개당수익 | 총매출액 | |
---|---|---|---|---|---|
0 | 20220103 | A | 3 | 300 | 900 |
1 | 20220105 | B | 5 | 400 | 2000 |
2 | 20230105 | A | 5 | 500 | 2500 |
3 | 20230127 | B | 10 | 600 | 6000 |
4 | 20220203 | A | 10 | 400 | 4000 |
5 | 20220205 | B | 10 | 500 | 5000 |
6 | 20230210 | A | 15 | 500 | 7500 |
7 | 20230223 | B | 15 | 600 | 9000 |
8 | 20230312 | A | 20 | 600 | 12000 |
9 | 20230422 | B | 25 | 700 | 17500 |
10 | 20220505 | A | 30 | 600 | 18000 |
11 | 20230511 | A | 40 | 600 | 24000 |
df['new_date'] = pd.to_datetime(df['날짜'])
df.head()
날짜 | 제품 | 판매수 | 개당수익 | 총매출액 | new_date | |
---|---|---|---|---|---|---|
0 | 20220103 | A | 3 | 300 | 900 | 2022-01-03 |
1 | 20220105 | B | 5 | 400 | 2000 | 2022-01-05 |
2 | 20230105 | A | 5 | 500 | 2500 | 2023-01-05 |
3 | 20230127 | B | 10 | 600 | 6000 | 2023-01-27 |
4 | 20220203 | A | 10 | 400 | 4000 | 2022-02-03 |
df['year'] = df['new_date'].dt.year
df.head()
날짜 | 제품 | 판매수 | 개당수익 | 총매출액 | new_date | year | |
---|---|---|---|---|---|---|---|
0 | 20220103 | A | 3 | 300 | 900 | 2022-01-03 | 2022 |
1 | 20220105 | B | 5 | 400 | 2000 | 2022-01-05 | 2022 |
2 | 20230105 | A | 5 | 500 | 2500 | 2023-01-05 | 2023 |
3 | 20230127 | B | 10 | 600 | 6000 | 2023-01-27 | 2023 |
4 | 20220203 | A | 10 | 400 | 4000 | 2022-02-03 | 2022 |
print(df.loc[(df['year'] == 2022)]['총매출액'].sum())
print(df.loc[(df['year'] == 2023)]['총매출액'].sum())
29900 78500
print(abs(df.loc[(df['year'] == 2023)]['총매출액'].sum() - df.loc[(df['year'] == 2022)]['총매출액'].sum()))
48600
Q23. '23년 총 매출액이 큰 제품의 23년 판매수를 구하시오.
df = pd.DataFrame({
'날짜' : ['20220103','20220105', '20230105', '20230127', '20220203', '20220205','20230210', '20230223','20230312','20230422','20220505','20230511']
,'제품' : ['A','B', 'A', 'B','A','B', 'A','B','A','B','A','A']
,'판매수' : [3, 5, 5, 10, 10, 10, 15, 15, 20, 25, 30, 40]
,'개당수익' : [300, 400, 500, 600, 400 ,500, 500, 600, 600, 700, 600, 600]
})
df
날짜 | 제품 | 판매수 | 개당수익 | |
---|---|---|---|---|
0 | 20220103 | A | 3 | 300 |
1 | 20220105 | B | 5 | 400 |
2 | 20230105 | A | 5 | 500 |
3 | 20230127 | B | 10 | 600 |
4 | 20220203 | A | 10 | 400 |
5 | 20220205 | B | 10 | 500 |
6 | 20230210 | A | 15 | 500 |
7 | 20230223 | B | 15 | 600 |
8 | 20230312 | A | 20 | 600 |
9 | 20230422 | B | 25 | 700 |
10 | 20220505 | A | 30 | 600 |
11 | 20230511 | A | 40 | 600 |
df['new_date'] = pd.to_datetime(df['날짜'])
df['year'] = df['new_date'].dt.year
df.head()
날짜 | 제품 | 판매수 | 개당수익 | new_date | year | 총매출액 | |
---|---|---|---|---|---|---|---|
0 | 20220103 | A | 3 | 300 | 2022-01-03 | 2022 | 900 |
1 | 20220105 | B | 5 | 400 | 2022-01-05 | 2022 | 2000 |
2 | 20230105 | A | 5 | 500 | 2023-01-05 | 2023 | 2500 |
3 | 20230127 | B | 10 | 600 | 2023-01-27 | 2023 | 6000 |
4 | 20220203 | A | 10 | 400 | 2022-02-03 | 2022 | 4000 |
df['총매출액'] = df['판매수'] * df['개당수익']
df.head()
날짜 | 제품 | 판매수 | 개당수익 | new_date | year | 총매출액 | |
---|---|---|---|---|---|---|---|
0 | 20220103 | A | 3 | 300 | 2022-01-03 | 2022 | 900 |
1 | 20220105 | B | 5 | 400 | 2022-01-05 | 2022 | 2000 |
2 | 20230105 | A | 5 | 500 | 2023-01-05 | 2023 | 2500 |
3 | 20230127 | B | 10 | 600 | 2023-01-27 | 2023 | 6000 |
4 | 20220203 | A | 10 | 400 | 2022-02-03 | 2022 | 4000 |
df_23 = df.loc[df['year'] == 2023]
df_23
날짜 | 제품 | 판매수 | 개당수익 | new_date | year | 총매출액 | |
---|---|---|---|---|---|---|---|
2 | 20230105 | A | 5 | 500 | 2023-01-05 | 2023 | 2500 |
3 | 20230127 | B | 10 | 600 | 2023-01-27 | 2023 | 6000 |
6 | 20230210 | A | 15 | 500 | 2023-02-10 | 2023 | 7500 |
7 | 20230223 | B | 15 | 600 | 2023-02-23 | 2023 | 9000 |
8 | 20230312 | A | 20 | 600 | 2023-03-12 | 2023 | 12000 |
9 | 20230422 | B | 25 | 700 | 2023-04-22 | 2023 | 17500 |
11 | 20230511 | A | 40 | 600 | 2023-05-11 | 2023 | 24000 |
df_23.groupby('제품')['총매출액'].sum()
제품 A 46000 B 32500 Name: 총매출액, dtype: int64
df_23.loc[df_23['제품'] == 'A']['판매수'].sum()
80
Q24. 매출액이 4천원 초과, 1만원 미만인 데이터 수를 출력하시오. (매출액 = 판매수 * 개당수익)
df = pd.DataFrame({
'날짜' : ['20220103','20220105', '20230105', '20230127', '20220203', '20220205','20230210', '20230223','20230312','20230422','20220505','20230511']
,'제품' : ['A','B', 'A', 'B','A','B', 'A','B','A','B','A','A']
,'판매수' : [3, 5, 5, 10, 10, 10, 15, 15, 20, 25, 30, 40]
,'개당수익' : [300, 400, 500, 600, 400 ,500, 500, 600, 600, 700, 600, 600]
})
df
날짜 | 제품 | 판매수 | 개당수익 | |
---|---|---|---|---|
0 | 20220103 | A | 3 | 300 |
1 | 20220105 | B | 5 | 400 |
2 | 20230105 | A | 5 | 500 |
3 | 20230127 | B | 10 | 600 |
4 | 20220203 | A | 10 | 400 |
5 | 20220205 | B | 10 | 500 |
6 | 20230210 | A | 15 | 500 |
7 | 20230223 | B | 15 | 600 |
8 | 20230312 | A | 20 | 600 |
9 | 20230422 | B | 25 | 700 |
10 | 20220505 | A | 30 | 600 |
11 | 20230511 | A | 40 | 600 |
df['매출액'] = df['판매수'] * df['개당수익']
df
날짜 | 제품 | 판매수 | 개당수익 | 매출액 | |
---|---|---|---|---|---|
0 | 20220103 | A | 3 | 300 | 900 |
1 | 20220105 | B | 5 | 400 | 2000 |
2 | 20230105 | A | 5 | 500 | 2500 |
3 | 20230127 | B | 10 | 600 | 6000 |
4 | 20220203 | A | 10 | 400 | 4000 |
5 | 20220205 | B | 10 | 500 | 5000 |
6 | 20230210 | A | 15 | 500 | 7500 |
7 | 20230223 | B | 15 | 600 | 9000 |
8 | 20230312 | A | 20 | 600 | 12000 |
9 | 20230422 | B | 25 | 700 | 17500 |
10 | 20220505 | A | 30 | 600 | 18000 |
11 | 20230511 | A | 40 | 600 | 24000 |
df.loc[(df['매출액'] > 4000) & (df['매출액'] < 10000)]
날짜 | 제품 | 판매수 | 개당수익 | 매출액 | |
---|---|---|---|---|---|
3 | 20230127 | B | 10 | 600 | 6000 |
5 | 20220205 | B | 10 | 500 | 5000 |
6 | 20230210 | A | 15 | 500 | 7500 |
7 | 20230223 | B | 15 | 600 | 9000 |
len(df.loc[(df['매출액'] > 4000) & (df['매출액'] < 10000)])
4
Q25. 23년 9월 24일 16:00 ~ 22:00 사이에 전체 제품의 판매수를 구하시오.
df = pd.DataFrame({
'물품' : ['A','B', 'A', 'B','A','B', 'A']
,'판매수' : [5, 10, 15, 15, 20, 25, 40]
,'개당수익' : [500, 600, 500, 600, 600, 700, 600]
})
time = pd.date_range('2023-09-24 12:25:00', '2023-09-25 14:45:30', periods= 7)
df['time'] = time
df = df[['time', '물품', '판매수', '개당수익']]
df
time | 물품 | 판매수 | 개당수익 | |
---|---|---|---|---|
0 | 2023-09-24 12:25:00 | A | 5 | 500 |
1 | 2023-09-24 16:48:25 | B | 10 | 600 |
2 | 2023-09-24 21:11:50 | A | 15 | 500 |
3 | 2023-09-25 01:35:15 | B | 15 | 600 |
4 | 2023-09-25 05:58:40 | A | 20 | 600 |
5 | 2023-09-25 10:22:05 | B | 25 | 700 |
6 | 2023-09-25 14:45:30 | A | 40 | 600 |
#풀이1
(df['time'] >= '2023-09-24 16:00') & (df['time'] <= '2023-09-24 22:00')
0 False 1 True 2 True 3 False 4 False 5 False 6 False Name: time, dtype: bool
df.loc[(df['time'] >= '2023-09-24 16:00') & (df['time'] <= '2023-09-24 22:00')]['판매수'].sum()
25
Q26. 9월 25일 00:00 ~ 12:00 까지의 B 물품의 매출액 총합을 구하시오. (매출액 = 판매수 * 개당수익)
df = pd.DataFrame({
'물품' : ['A','B', 'A', 'B','A','B', 'A']
,'판매수' : [5, 10, 15, 15, 20, 25, 40]
,'개당수익' : [500, 600, 500, 600, 600, 700, 600]
})
df['time'] = pd.date_range('2023-09-24 12:25:00', '2023-09-25 14:45:30', periods= 7)
df = df[['time', '물품', '판매수', '개당수익']]
df = df.set_index('time', drop = True)
df
물품 | 판매수 | 개당수익 | |
---|---|---|---|
time | |||
2023-09-24 12:25:00 | A | 5 | 500 |
2023-09-24 16:48:25 | B | 10 | 600 |
2023-09-24 21:11:50 | A | 15 | 500 |
2023-09-25 01:35:15 | B | 15 | 600 |
2023-09-25 05:58:40 | A | 20 | 600 |
2023-09-25 10:22:05 | B | 25 | 700 |
2023-09-25 14:45:30 | A | 40 | 600 |
df = df.reset_index()
df.set_index('time', drop = False)
df
time | 물품 | 판매수 | 개당수익 | |
---|---|---|---|---|
0 | 2023-09-24 12:25:00 | A | 5 | 500 |
1 | 2023-09-24 16:48:25 | B | 10 | 600 |
2 | 2023-09-24 21:11:50 | A | 15 | 500 |
3 | 2023-09-25 01:35:15 | B | 15 | 600 |
4 | 2023-09-25 05:58:40 | A | 20 | 600 |
5 | 2023-09-25 10:22:05 | B | 25 | 700 |
6 | 2023-09-25 14:45:30 | A | 40 | 600 |
#문제 25번 풀이2 - 인덱스가 time일때 between_time 메소드 활용
df.between_time(start_time= '16:00', end_time= '22:00')
물품 | 판매수 | 개당수익 | |
---|---|---|---|
time | |||
2023-09-24 16:48:25 | B | 10 | 600 |
2023-09-24 21:11:50 | A | 15 | 500 |
#풀이2
#매출액 변수 추가
df['매출액'] = df['판매수'] * df['개당수익']
#time 변수 추가, index 초기화
df = df.reset_index() #default - drop = False
# index 새로고침
df = df.set_index('time', drop= False)
# 데이터 타입 datetime으로 변경
df['time'] = pd.to_datetime(df['time'])
# 9월 25일 필터링 - df['변수].between( , )
df_after = df[df['time'].between('2023-09-25', '2023-09-26')] #26일은 미포함
# 시간 필터링 00:00 ~ 12:00 (주의 : 시간이 index에 위치해야 함)
df = df_after.between_time(start_time= '00:00', end_time= '12:00') #포함기준
# B 물품의 매출액 총합
df = df[df['물품'] == 'B']
print(df['매출액'].sum())
26500
#풀이1
df1 = df.reset_index()
df1['매출액'] = df1['판매수'] * df1['개당수익']
df1.loc[(df1['time'] >= '2023-09-25 00:00:00') & (df1['time'] <= '2023-09-25 12:00:00') & (df1['물품'] == 'B')]['매출액'].sum()
26500
Q27. 9월 24일 12:00 ~ 24:00 까지의 A 물품의 매출액 총합을 구하시오. (매출액 = 판매수 * 개당수익)
df = pd.DataFrame({
'물품' : ['A','B', 'A', 'B','A','B', 'A']
,'판매수' : [5, 10, 15, 15, 20, 25, 40]
,'개당수익' : [500, 600, 500, 600, 600, 700, 600]
})
df['time'] = pd.date_range('2023-09-24 12:25:00', '2023-09-25 14:45:30', periods= 7)
df = df[['time', '물품', '판매수', '개당수익']]
df = df.set_index('time', drop = True)
df
물품 | 판매수 | 개당수익 | |
---|---|---|---|
time | |||
2023-09-24 12:25:00 | A | 5 | 500 |
2023-09-24 16:48:25 | B | 10 | 600 |
2023-09-24 21:11:50 | A | 15 | 500 |
2023-09-25 01:35:15 | B | 15 | 600 |
2023-09-25 05:58:40 | A | 20 | 600 |
2023-09-25 10:22:05 | B | 25 | 700 |
2023-09-25 14:45:30 | A | 40 | 600 |
#풀이1
df1 = df.reset_index()
df1['매출액'] = df1['판매수'] * df1['개당수익']
df1
time | 물품 | 판매수 | 개당수익 | 매출액 | |
---|---|---|---|---|---|
0 | 2023-09-24 12:25:00 | A | 5 | 500 | 2500 |
1 | 2023-09-24 16:48:25 | B | 10 | 600 | 6000 |
2 | 2023-09-24 21:11:50 | A | 15 | 500 | 7500 |
3 | 2023-09-25 01:35:15 | B | 15 | 600 | 9000 |
4 | 2023-09-25 05:58:40 | A | 20 | 600 | 12000 |
5 | 2023-09-25 10:22:05 | B | 25 | 700 | 17500 |
6 | 2023-09-25 14:45:30 | A | 40 | 600 | 24000 |
df1.loc[(df1['time'] >= '2023-09-24 12:00:00') & (df1['time'] < '2023-09-25 00:00:00') & (df1['물품'] == 'A')]['매출액'].sum()
10000