任務描述
本關爲練習關卡,請按照編程要求完成任務,獲取美國各州2010年的人口密度排名。
編程要求
- 使用
read_csv()
函數讀取step3文件夾中的state-population.csv(pop)
、state-areas.csv(areas)
、state-abbrevs.csv(abbrevs)
文件;
- 合併
pop
和abbrevs
。我們需要將pop
的state/region
列與abbrevs
的abbreviation
列進行合併,還需要通過how='outer'
確保數據沒有丟失,得到合併後的結果,發現有一個重複列需要刪除,所以,刪除abbreviation
列;
- 來全面檢查一下數據是否有缺失,對每個字段逐行檢查是否有缺失值,通過結果可知只有
population
和state列
有缺失值;
- 查看
population
這一列爲缺失值的特徵。通過結果可以得到好像所有的人口缺失值都出現在2000年之前的波多黎各,此前並沒有統計過波多黎各的人口;
- 從上面的結果可以發現
state
這一列也有缺失值,通過下列代碼可以查看是哪些州有缺失值;merged.loc[merged['state'].isnull(),'state/region'].unique()
我們可以快速解決這個問題:人口數據中包含波多黎各(PR
)和全國總數(USA
),但這兩項沒有出現在州名稱縮寫表中。我們可以用以下代碼來填充對應的全稱;merged.loc[merged['state/region'] == 'PR', 'state'] = 'Puerto Rico' merged.loc[merged['state/region'] == 'USA', 'state'] = 'United States'
- 然後我們用類似的規則將面積數據和處理完後的merged合併起來。數據合併的鍵爲state,連接方式爲左連接;
- 檢查缺失值,從結果中可以發現,area列中還有缺失值;
- 查看是哪個地區面積缺失。結果如下:
從上面的結果可以得出缺少的是全美國的面積數據,但是我們的目標數據並不需要全美國的面積數據,所以我們需要刪掉這些缺失值;- 取year爲2010年的數據,並將索引設爲state列;
計算人口密度,將2010年的人口population除以面積area (sq. mi);- 由於人口密度中分爲成年人的人口密度和未成年人的人口密度,所以我們需要對兩個值進行求合得到最終的人口密度;
對值進行排序,取人口密度結果的前5名與倒數5名;- 具體要求請參見後續測試樣例。
請先仔細閱讀右側上部代碼編輯區內給出的代碼框架,再開始你的編程工作!
測試說明
平臺會對你編寫的代碼進行測試,對比你輸出的數值與實際正確的數值,只有所有數據全部計算正確才能進入下一關。
測試輸入:
無測試輸入
預期輸出:
前5名:
state
District of Columbia 10388.735294
Puerto Rico 1313.841536
New Jersey 1245.668425
Rhode Island 825.732686
Connecticut 792.459776
dtype: float64
後5名:
state
South Dakota 13.217619
North Dakota 11.661617
Montana 8.254689
Wyoming 7.151782
Alaska 1.373759
dtype: float64
一點說明:數據集中人口分爲未成年
和全部年齡的人
,而出題者誤以爲是未成年
和成年人
,爲了通過測試,只能將二者人口相加
import pandas as pd
import numpy as np
def task3():
#********** Begin **********#
#讀取三個csv文件
pop = pd.read_csv('./step3/state-population.csv')
areas = pd.read_csv('./step3/state-areas.csv')
abbrevs = pd.read_csv('./step3/state-abbrevs.csv')
# 合併pop和abbrevs並刪除重複列
merged = pd.merge(pop, abbrevs, how='outer',
left_on='state/region', right_on='abbreviation')
merged = merged.drop('abbreviation', 1)
# 填充對應的全稱
merged.loc[merged['state/region'] == 'PR', 'state'] = 'Puerto Rico'
merged.loc[merged['state/region'] == 'USA', 'state'] = 'United States'
# 合併面積數據
final = pd.merge(merged, areas, on='state', how='left')
# 刪掉這些缺失值
final.dropna(inplace=True)
# 取year爲2010年的兩種人口的數據
data2010_1= final.query("year == 2010 & ages == 'total'")
data2010_2=final.query("year == 2010 & ages == 'under18'")
# 二者人口相加
p=np.array(data2010_1.loc[:,'population'])+np.array(data2010_2.loc[:,'population'])
data2010=data2010_1.copy()
data2010.loc[:,'population']=p
#設置州爲索引
data2010.set_index('state', inplace=True)
#計算人口密度
density = data2010['population'] / data2010['area (sq. mi)']
# 對值進行排序
density.sort_values(ascending=False, inplace=True)
# 輸出人口密度前5名和倒數5名
print('前5名:')
print(density[:5])
print('後5名:')
print(density[-5:])
#********** End **********#