Target Data(CSV): Global Internet Usage(국가별 인터넷 사용률)
[DS]EDA Level Test_week 4/solution/datas/wiki_population.csv
pip install pycountry
또는 conda install -c conda-forge pycountry
📌 답안
df_target = df_target.dropna(axis=0,subset=['incomeperperson', 'internetuserate', 'urbanrate'])
check_01_01(df_target)
df_target_change_list = [
(33, 'Cabo Verde'),
(35, 'Central African Republic'),
(41, 'Congo, The Democratic Republic of the'),
(42, 'Congo'),
(45, "Côte d'Ivoire"),
(49, 'Czech Republic'),
(53, 'Dominican Republic'),
(83, 'Hong Kong'),
(100, 'Korea, Republic of'),
(103, "Lao People's Democratic Republic"),
(112, 'Macao'),
(113, 'Republic of North Macedonia'),
(125, 'Federated States of Micronesia'),
(183, 'Eswatini'),
(210, 'Yemen')
]
📌 답안
for i in df_target_change_list :
df_target.at[i[0], 'country'] = i[1]
1-2의 DataFrame(df_target)과 pycountry Library를 이용하여 아래 조건에 맞게 국가코드를 구하세요.
- 참고: pycountry.countries
- ISO 3166-2(전 세계 나라 및 부속 영토의 주요 구성 단위의 명칭에 고유 부호(코드)를 부여하는 국제 표준) 기준 국가별 코드를 얻을 수 있는 Python Library
- 국가명 표기 방식에 따라 잘못된 값 또는 값 검색이 안되는 경우가 많아 주의가 필요함
- 예시: 대한민국의 경우 'south korea', 'republic of korea', 'korea', 'korea, republic of' 등으로 표기되는데, 이 중 'korea, republic of' 로만 정확한 국가 코드를 얻을 수 있음
- 혼선을 줄이기 위하여 문제 1-2와 같이 변경할 국가명을 제공함
- 사용법(상세 사용법은 2.Datas의 참고사항 내 링크 참조)
- 국가 검색 방법
- 일반 검색: pycountry.countries.get(name=country_name) -> 하나의 결과값을 return
- fuzzy 검색: pycountry.countries.search_fuzzy(country_name) -> 하나 이상의 결과값을 list형태로 return
- 예시
- 조건1: df_target에 'code'컬럼을 추가하여 각 row(행)의 국가명에 맞는 2글자 국가코드(alpha_2)를 입력하세요.
- 조건2: 일반검색(pycountry.countries.get(name=country_name))을 우선 이용 해보고, 결과값이 안 나올 경우 fuzzy 검색(pycountry.countries.search_fuzzy(country_name))을 활용하여 검색하세요.
- 조건3: fuzzy 검색을 이용할 경우, 결과값 list의 첫번째 값(index=0)의 국가코드를 입력하세요.
- 조건4: Index 또는 순서(order)는 변경하지 마세요.
- hint: Python 예외처리(try-except)를 활용해 보세요.
📌 답안
import pycountry
for idx, row in df_target.iterrows():
country_name = row.country
# turkey >> 'Türkiye'
if country_name == 'Turkey':
country_name = 'Türkiye'
try:
country = pycountry.countries.get(name=country_name)
df_target.at[idx, 'code'] = country.alpha_2
except:
country = pycountry.countries.search_fuzzy(country_name)
df_target.at[idx, 'code'] = country[0].alpha_2
LookupError: turkey
국가명이 Turkey -> Türkiye로 바뀌면서 에러가 났다.
바뀐 국가명 서치해본뒤 if문 넣어서 해결
📌 답안
import pandas as pd
url = 'https://en.wikipedia.org/wiki/List_of_countries_and_dependencies_by_population'
df = pd.read_html(url, header=0)[0]
columns = ['Rank', 'Country / Dependency', 'Population', '% of the world', 'Date', 'Source (official or from the United Nations)', 'Notes']
df.columns = columns
import copy
df_population = df.copy()
- https://wwwi.tistory.com/376
- https://blog.naver.com/m_biz/223062483264
힌트 없었으면 진짜 때려쳤을지도 모른다..
📌 답안
# 조건1: Column(열) 중 'Country / Dependency', 'Population' 2개만 남기세요.
df_population = df_population[['Country / Dependency', 'Population']]
# 조건2: 컬럼명을 아래와 같이 변경하세요.
# - 'Country / Dependency' -> 'country'
# - 'Population' -> 'population'
col = ['country','population']
df_population.columns = col
# 조건3: 'country' Column(열)의 값이 'World'인 첫번째 인덱스(index=0)을 삭제하세요.
df_population.drop([0],axis=0, inplace=True)
df_population_change_dict = {
'Bermuda (United Kingdom)': 'Bermuda',
'Cape Verde': 'Cabo Verde',
'DR Congo': 'Congo, The Democratic Republic of the',
'Ivory Coast': "Côte d'Ivoire",
'Greenland (Denmark)': 'Greenland',
'Hong Kong (China)': 'Hong Kong',
'South Korea': 'Korea, Republic of',
'Laos': "Lao People's Democratic Republic",
'Macau (China)': 'Macao',
'North Macedonia': 'Republic of North Macedonia',
'Micronesia': 'Federated States of Micronesia',
'Puerto Rico (United States)': 'Puerto Rico',
'Slovakia': 'Slovak Republic',
'East Timor': 'Timor-Leste',
}
📌 답안
for idx, row in df_population.iterrows() :
for key, value in df_population_change_dict.items() :
if row.country == key :
df_population.at[idx, 'country'] = value
📌 답안
df = pd.merge(df_target, df_population, how='inner', on='country').sort_values(by='code', ascending=True).reset_index(drop=True)
📌 답안
# 조건1
df_region.loc[df_region['name']=='Namibia', 'alpha-2'] = 'NA'
# 조건2
df_region.drop(labels=df_region_drop_col, axis=1, inplace=True )
# 조건3
df_region.rename(columns=df_region_rename_dict, inplace=True)
📌 답안
#조건 1~4
df_merge = pd.merge(df, df_region, how='inner', on='code').sort_values(by='code',ascending=True)
df_merge.head()
#조건5
df_merge.rename(columns=df_rename_dict,inplace=True)
# 조건6,조건7,조건8
df_merge = df_merge[new_col_order].reset_index(drop=True)
- 컬럼명 변경
- 컬럼순서변경
📌 답안
def groupby_weighted_avg(values, weighted_value, Group_Cols):
return (values * weighted_value).groupby(Group_Cols).sum() / weighted_value.groupby(
Group_Cols
).sum()
# 국가별 인터넷 사용률 가중평균 groupby dataframe 생성
test1 = groupby_weighted_avg(df["internet_use_rate"],df["population"],[df["region"],df["sub_region"]])
weighted_ave_internet = pd.DataFrame(test1)
# 국가별 인당 소득 가중평균 groupby dataframe 생성
test2 = groupby_weighted_avg(df["income_per_person"],df["population"],[df["region"],df["sub_region"]])
weighted_ave_income = pd.DataFrame(test2)
# 두 데이터 프레임 합치기
merged = pd.merge(weighted_ave_internet, weighted_ave_income, left_index=True, right_index=True)
# 컬럼명 변경
df_result = merged.rename(columns={"0_x":"weighted_ave_internet", "0_y" : "weighted_ave_income" })
- 가중평균에 대해서
- groupby 가중평균
- 인덱스가 같은 두 데이터 프레임 합치는법
pd.merge(df1, df2, left_index=True, right_index=True)
📌 답안
# 조건2: 중국(국가코드(code): 'CN)과 인도(국가코드: 'IN')를 제외한 Asia(region) - Eastern Asia, Southern Asia (sub_region)
test = df[(df["code"] != "IN") & (df["code"] != "CN")]
test = test[(test["sub_region"] == "Eastern Asia") | (test["sub_region"] == "Southern Asia")]
# 문제 4-1과 같이 가중평균 각각 데이터프레임 그룹바이한뒤
# merge로 합치고 columns rename
def groupby_weighted_avg(values, weighted_value, Group_Cols):
return (values * weighted_value).groupby(Group_Cols).sum() / weighted_value.groupby(
Group_Cols
).sum()
# internet_use_rate 가중평균 그룹바이
test1 = groupby_weighted_avg(test["internet_use_rate"],test["population"],[test["region"],test["sub_region"]])
weighted_ave_internet = pd.DataFrame(test1)
# income_per_person 가중평균 그룹바이
test2 = groupby_weighted_avg(test["income_per_person"],test["population"],[test["region"],test["sub_region"]])
weighted_ave_income = pd.DataFrame(test2)
# 두 데이터 프레임 합치기
merged = pd.merge(weighted_ave_internet, weighted_ave_income, left_index=True, right_index=True)
# 컬럼명 변경
df_result = merged.rename(columns={"0_x":"weighted_ave_internet", "0_y" : "weighted_ave_income" })