1-1 . Target Data 가져오기
import
import pandas as pd
import copy
df_target = pd.read_csv('../source_code/datas-20240219T072537Z-001/datas/Summer-Olympic-medals-1976-to-2008.csv', encoding='unicode_escape' )
df_target
1-2. Preprocessing : missing data처리
조건1: missing data가 있다면, 해당 row(행)를 삭제(drop)하세요
조건2: Index를 초기화(reset)하고, 기존 Index는 삭제(drop)하세요.
null값 삭제 : .dropna()
index 재설정 : reset_index()
df_target.dropna(axis=0, inplace=True)
df_target.reset_index(drop=True, inplace=True)
15316 rows X 11 columns
1-3. preprocessing : Data Type 정리
조건1: float data는 int로 변경해주세요.
조건2: float data외의 모든 데이터가 string 인지 확인해주세요.
데이터 타입 확인 : .dtypes
데이터 타입 변경 : .astype()
df_target.dtypes
df_target['Year'] = df_target['Year'].astype('int')
df_target.info()
2-1. 2008년 대한민국 메달리스트 찾기
문제 1에서 만든 DataFrame을 이용하여 2008년 베이징 올림픽 양궁 종목에서 금메달을 획득한 선수들을 찾아보세요.
조건1: 2008년 베이징 올림픽 양궁 종목의 금메달리스트만 있는 DataFrame을 만들어 주세요
df_archery = df_target.copy()
df_archery = df_archery[(df_archery['City'] == 'Beijing')&(df_archery['Discipline']=='Archery')&(df_archery['Medal']=='Gold')&(df_archery['Country_Code']=='KOR')]
df_archery
2-2. 대한민국 여대 하계 올림픽 메달 획득 내역 확인
DataFrame과 Pandas 기능을 활용하여 대한민국 역대 메달 획득 내역을 만들어주세요.
조건1: Index는 Year - Medal로 보여주세요(아래 예시 참고)
조건2: Index에서 Year는 내림차순, Medal은 Gold-Silver-Bronze 순으로 보여주세요
hint1: 앞서 이야기 한 바와 같이, 메달 숫자는 복식/단체 종목을 감안하여 선수명(Athlete)과 성별(Gender)를 제외한 내용이 일치할 경우 같은 경기에서 획득한 메달로 간주하시면 됩니다.
hint2: 내용이 일치하는 데이터를 삭제하기 위한 방법은 drop_duplicate, groupby, pivot_table 등 다양한 방법이 있습니다.
hint3: Medal Index의 정렬 순서를 'Gold'-'Silver'-'Bronze'로 하기 위해서 sort_index의 'key' argument에 dictionary를 활용할 수 있습니다. - 이 외에 sort_index의 다른 arguments도 확인해 보세요
중복되는 내용의 행 삭제하기 : drop_duplicates(subset='컬럼지정')
인덱스 순서 정럴 : .sort_index(level=인덱스 , key= medal_order 딕셔너리로 map적용, sort_remaining=다른 인덱스 정렬여부)
df_target_copy = df_target.copy()
df_target_copy = df_target_copy[df_target_copy['Country']=='Korea, South']
df_target_copy.drop_duplicates(subset=['City','Year','Sport','Discipline','Event','Country_Code','Country','Medal','Event_gender'], ignore_index=True, keep='first', inplace=True)
df_target_copy['City'] = 1
medal_order = {'Gold':0, 'Silver':1, 'Bronze':2}
df_kor = pd.pivot_table(df_target_copy, index=['Year','Medal'], values='City', aggfunc='sum').sort_index(level = 1, key = lambda x : x.map(medal_order), sort_remaining = False).sort_index(level = 0, ascending=True, sort_remaining = False)
2-3. 1996년 애틀란타 올림픽 총 메달 개수 기준 상위 10개 국가 확인
조건1: Index는 앞선 1단계에서 Preprocessing한 Data의 Index 그대로 나두어 주세요.
조건2: 총 메달 개수로 오름차순 정렬 후 상위 10개 국가만 나타내는 DataFrame을 만드세요.
조건3: 결과 DataFrame의 Columns은 ['Country', 'Medal'] 입니다
.groupby() 입력된 컬럼으로 그룹화한다.
.count()
.nlargest() : 컬럼을 기준으로 내림차순 한 후 n개의 열 반환
# 2-3
df_rank_copy = df_target.copy()
df_rank_copy = df_rank_copy[df_rank_copy['City'] == 'Atlanta']
df_rank_copy.drop_duplicates(subset=['City','Year','Sport','Discipline','Event','Country_Code','Country','Medal','Event_gender'], ignore_index=True, keep='first', inplace=True)
df_rank_10 = df_rank_copy.groupby(['Country'], as_index=False)['Medal'].count()
df_rank_10.sort_values(by='Medal', ascending=False, axis=0, inplace=True)
df_rank_10 = df_rank_10.nlargest(10, 'Medal', keep='last')
df_rank_10
2-4. 1996년 애틀란타 올림픽 금메달 개수 기준 상위 10개 국가 확인하기
조건1: 'Gold', 'Silver', 'Bronze' 컬럼을 만들고, 해당 Row(행)의 Medal 이 Gold면 'Gold' 컬럼에 1, Silver면 'Silver' 컬럼에 1, 'Bronze'면 'Bronze'컬럼에 1을 입력하세요
조건2: Index는 앞선 1단계에서 Preprocessing한 Data의 Index 그대로 나두어 주세요.
조건3: 금메달 개수로 내림차순 정렬 후 상위 10개 국가만 나타내는 DataFrame을 만드세요. - 만약 금메달 개수가 같다면, 은메달 개수가 많은 국가가 더 높은 순위이며 은메달 개수도 같다면 동메달 개수가 더 많은 국가가 상위입니다.
조건4: 결과 DataFrame의 Columns은 ['Country', 'Gold', 'Silver', 'Bronze'] 입니다.
반복문 사용하여 gold, silver, bronze컬럼에 1추가
정렬하기
# 2-4
import numpy as np
#반복문으로 gold, silver, bronze 컬럼에 1추가
df_rank_copy = df_target.copy()
df_rank_copy = df_rank_copy[df_rank_copy['City']=='Atlanta']
df_rank_copy.drop_duplicates(subset=['City','Year','Sport','Discipline','Event','Country_Code','Country','Medal','Event_gender'], ignore_index=True, keep='first',inplace=True)
df_rank_copy['Gold'] = np.nan
df_rank_copy['Silver'] = np.nan
df_rank_copy['Bronze'] = np.nan
for n in range (0, len(df_rank_copy.index)):
if df_rank_copy.loc[n, 'Medal'] == 'Gold':
df_rank_copy.loc[n,'Gold'] = 1
elif df_rank_copy.loc[n, 'Medal'] == 'Silver':
df_rank_copy.loc[n,'Silver'] = 1
else:
df_rank_copy.loc[n,'Bronze'] = 1
df_rank_10 = df_rank_copy.groupby(['Country'], as_index=False)[['Gold','Silver','Bronze']].count()
df_rank_10.sort_values(by=['Gold','Silver','Bronze'], ascending=False, inplace=True)
df_rank_10 = df_rank_10.nlargest(10, 'Gold')
df_rank_10
자료 출처 : 제로베이스 데이터 취업 스쿨