1-2) Preprocessing: missing data 처리
1)
df_target.loc[df_target['City'].isnull()]
df_target.dropna(axis=0, inplace = True)
2)
df_target.dropna(axis=0, inplace=True)
df_target.reset_index()
1-3) Preprocessing: Data Type 정리
df_target['Year'] = df_target['Year'].astype('int64')
df_target.info()
2-1) 2008년 대한민국 메달리스트 찾기
1)
df_archery = df_target.copy()
df_archery = df_archery[
(df_archery['Sport'] == 'Archery')&
(df_archery['Year'] == 2008)&
(df_archery['City'] == 'Beijing')&
(df_archery['Medal'] == 'Gold')&
(df_archery['Country'].str.contains('Korea'))
]
2)
df_copy = df_target.copy()
df_kor = df_copy[df_copy['Country_Code'] == 'KOR']
df_archery = df_kor[(df_kor['Year'] == 2008) & (df_kor['City'] == 'Beijing') & (df_kor['Sport'] == 'Archery') & (df_kor['Medal'] == 'Gold')]
check_02_01(df_archery)
2-2) 대한민국 역대(1976-2008) 하계 올림픽 메달 획득 내역 확인
문제 1에서 만든 DataFrame과 Pandas 기능을 활용하여 아래 예시와 같은 형태의 대한민국 역대 메달 획득 내역을 만들어주세요.
조건1: Index는 Year - Medal로 보여주세요
조건2: Index에서 Year는 내림차순, Medal은 Gold-Silver-Bronze 순으로 보여주세요
# 2-2
df_target2 = df_target[df_target['Country'] == 'Korea, South'].copy()
df_target2 = df_target2.drop_duplicates(subset = ['City','Year', 'Sport', 'Discipline',
'Event', 'Country_Code', 'Country',
'Event_gender', 'Medal'])
df_kor = df_target2.pivot_table(index=['Year', 'Medal'], values = 'City', aggfunc='count')
df_kor = df_kor.reindex(['Gold', 'Silver', 'Bronze'], level=1)
2-3) 1996년 애틀란타 올림픽 총 메달 개수 기준 상위 10개 국가 확인
조건1: Index는 앞선 1단계에서 Preprocessing한 Data의 Index 그대로 나두어 주세요.
조건2: 총 메달 개수로 오름차순 정렬 후 상위 10개 국가만 나타내는 DataFrame을 만드세요.
조건3: 결과 DataFrame의 Columns은 ['Country', 'Medal'] 입니다.
df_rank = df_target.copy()
df_rank = df_rank[df_rank['Year'] == 1996]
df_rank = df_rank.drop_duplicates(subset = ['City','Year', 'Sport', 'Discipline',
'Event', 'Country_Code', 'Country',
'Event_gender', 'Medal'])
df_rank_10 = df_rank.groupby(['Country'])['Medal'].count()
df_rank_10 = pd.DataFrame(df_rank_10).reset_index()
df_rank_10.sort_values(by='Medal', ascending = False, inplace = True)
df_rank_10 = df_rank_10.head(10)
2-4) 1996년 애틀란타 올림픽 금매달 개수 기준 상위 10개 국가 확인
조건1: 'Gold', 'Silver', 'Bronze' 컬럼을 만들고, 해당 Row(행)의 Medal 이 Gold면 'Gold' 컬럼에 1, Silver면 'Silver' 컬럼에 1, 'Bronze'면 'Bronze'컬럼에 1을 입력하세요
추후 아래 예시와 같은 형태로 DataFrame을 만들기 위한 작업입니다. 적당한 순서에 맞추어 해당 작업을 하시면 되고, 혹시 이 작업이 필요 없을 경우 안하셔도 무방합니다.
조건2: Index는 앞선 1단계에서 Preprocessing한 Data의 Index 그대로 나두어 주세요.
조건3: 금메달 개수로 내림차순 정렬 후 상위 10개 국가만 나타내는 DataFrame을 만드세요.
만약 금메달 개수가 같다면, 은메달 개수가 많은 국가가 더 높은 순위이며 은메달 개수도 같다면 동메달 개수가 더 많은 국가가 상위입니다.
조건4: 결과 DataFrame의 Columns은 ['Country', 'Gold', 'Silver', 'Bronze'] 입니다
1)
df_rank2 = df_rank.copy()
df_rank2['Gold'] = 0
df_rank2['Silver'] = 0
df_rank2['Bronze'] = 0
for i in range(len(df_rank2)):
if df_rank2.iloc[i, -4] == 'Gold':
df_rank2.iloc[i, -3] += 1
if df_rank2.iloc[i, -4] == 'Silver':
df_rank2.iloc[i, -2] += 1
if df_rank2.iloc[i, -4] == 'Bronze':
df_rank2.iloc[i, -1] += 1
df_rank2 = df_rank2.pivot_table(index = 'Country', values = ['Gold', 'Silver', 'Bronze'], aggfunc = 'sum')
df_rank2.reset_index(inplace = True)
#열 순서 설정
df_rank2= df_rank2[['Country', 'Gold', 'Silver', 'Bronze']]
#정렬
df_rank2.sort_values(by=['Gold', 'Silver', 'Bronze'], ascending = False, inplace = True)
2)
# 2-4
df_copy = df_target.copy()
df_copy = df_copy[(df_copy['Year'] == 1996) & (df_copy['City'] == 'Atlanta')]
df_copy.drop_duplicates(['City', 'Year', 'Sport', 'Discipline', 'Event','Country_Code', 'Country', 'Event_gender', 'Medal'], inplace=True)
df_copy['Gold'] = (df_copy['Medal'] == 'Gold').astype(int)
df_copy['Silver'] = (df_copy['Medal'] == 'Silver').astype(int)
df_copy['Bronze'] = (df_copy['Medal'] == 'Bronze').astype(int)
df_ranked = df_copy.groupby('Country').agg({'Gold': 'sum', 'Silver': 'sum', 'Bronze': 'sum'}).reset_index()
df_ranked = df_ranked.sort_values(by=['Gold', 'Silver', 'Bronze'], ascending=False).head(10)
df_ranked = df_ranked[['Country', 'Gold', 'Silver', 'Bronze']]
✏️pivot table이 필요한 시점 잘 알아채기
피벗테이블 : 표로 정리해서 보고자 하는 관점의 축을 잡고, 표로 만들어 주는 기능(여러 데이터 중에서 자신이 원하는 데이터만을 가지고 원하는 행과 열에 데이터를 배치하여 새로운 보고서를 만드는 기능)