아이티윌_데이터 분석 55기/문제풀이_Python

#6-2. 6일차 퀴즈에 대한 문제풀이

ecosso 2026. 5. 18. 16:53

1. bigmart_train.csv 파일을 읽고

df = pd.read_csv('bigmart_train.csv')

df.info()

df.info()['Non-Null Count']
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8523 entries, 0 to 8522
Data columns (total 12 columns):
 #   Column                     Non-Null Count  Dtype  
---  ------                     --------------  -----  
 0   Item_Identifier            8523 non-null   object 
 1   Item_Weight                7060 non-null   float64
 2   Item_Fat_Content           8523 non-null   object 
 3   Item_Visibility            8523 non-null   float64
 4   Item_Type                  8523 non-null   object 
 5   Item_MRP                   8523 non-null   float64
 6   Outlet_Identifier          8523 non-null   object 
 7   Outlet_Establishment_Year  8523 non-null   int64  
 8   Outlet_Size                6113 non-null   object 
 9   Outlet_Location_Type       8523 non-null   object 
 10  Outlet_Type                8523 non-null   object 
 11  Item_Outlet_Sales          8523 non-null   float64
dtypes: float64(4), int64(1), object(7)
memory usage: 799.2+ KB

 

 1) Item_Weight의 결측치를 아이템코드별 Item_Weight의 평균으로 대치

     (단, 아이템코드는 Item_Identifier 컬럼의 앞 3자리)

더보기

[ 내 답변 ]

df.isnull().sum()

df.info()['Non-Null Count']
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8523 entries, 0 to 8522
Data columns (total 12 columns):
 #   Column                     Non-Null Count  Dtype  
---  ------                     --------------  -----  
 0   Item_Identifier            8523 non-null   object 
 1   Item_Weight                7060 non-null   float64
 2   Item_Fat_Content           8523 non-null   object 
 3   Item_Visibility            8523 non-null   float64
 4   Item_Type                  8523 non-null   object 
 5   Item_MRP                   8523 non-null   float64
 6   Outlet_Identifier          8523 non-null   object 
 7   Outlet_Establishment_Year  8523 non-null   int64  
 8   Outlet_Size                6113 non-null   object 
 9   Outlet_Location_Type       8523 non-null   object 
 10  Outlet_Type                8523 non-null   object 
 11  Item_Outlet_Sales          8523 non-null   float64
dtypes: float64(4), int64(1), object(7)
memory usage: 799.2+ KB

 

# 1) Item_Weight의 결측치를 아이템코드별 Item_Weight의 평균으로 대치
# (단, 아이템코드는 Item_Identifier 컬럼의 앞에 3자리)

df.loc[df['Item_Weight'].isnull(), :]

# 아이템코드 추출
f1 = lambda x : x[0:3]
df['Item_code'] = df['Item_Identifier'].map(f1)

# 아이템코드별 Item_Weight 평균 구하기
df_mean = df.groupby('Item_code')['Item_Weight'].transform('mean')

# 결측치 대치
df['Item_Weight'] = df['Item_Weight'].fillna(df_mean)

# 최종확인
df.isnull().sum()
df

df.isnull().sum()
Out[537]: 
Item_Identifier                 0
Item_Weight                     0
Item_Fat_Content                0
Item_Visibility                 0
Item_Type                       0
Item_MRP                        0
Outlet_Identifier               0
Outlet_Establishment_Year       0
Outlet_Size                  2410
Outlet_Location_Type            0
Outlet_Type                     0
Item_Outlet_Sales               0
Item_code                       0

 

[ 문제풀이 ]

groups = df['Item_Identifier'].map(lambda x : x[:3])
vmean = df.groupby(groups)['Item_Weight'].transform('mean')
df['Item_Weight'].fillna(vmean).isnull().any()
df['Item_Weight'] =  df['Item_Weight'].fillna(vmean)

 

 

 2) Outlet_Size 컬럼값이 결측치인 행을 제외하기 전의 Item_MRP의 평균과 제거후의 Iteme_MRP 평균의 차이에 대한 절댓값을 소숫점 둘째자리까지 반올림하여 출력

더보기

[ 내 답변 ]

# 제거 전 평균
mean1 = df['Item_MRP'].mean()

 

# 결측치가 있는 행 제외
df2 = df.dropna(subset = ['Outlet_Size'])
mean2 = df2['Item_MRP'].mean()

 

# 평균의 차이에 대한 절댓값 출력
round(abs(mean1 - mean2), 2)

round(abs(mean1 - mean2), 2)
Out[559]: np.float64(0.26)

 

[ 문제풀이 ]

bmean = df['Item_MRP'].mean()
df = df.dropna(subset=['Outlet_Size'])
amean = df['Item_MRP'].mean()
round(abs(amean - bmean), 2)