EduCoder Pandas合併數據集 第三關:案例:美國各州的統計數據


任務描述

本關爲練習關卡,請按照編程要求完成任務,獲取美國各州2010年的人口密度排名。

編程要求

  • 使用read_csv()函數讀取step3文件夾中的state-population.csv(pop)state-areas.csv(areas)state-abbrevs.csv(abbrevs)文件;
    在這裏插入圖片描述
    在這裏插入圖片描述在這裏插入圖片描述
  • 合併popabbrevs。我們需要將popstate/region列與abbrevsabbreviation列進行合併,還需要通過how='outer'確保數據沒有丟失,得到合併後的結果,發現有一個重複列需要刪除,所以,刪除abbreviation列;
    在這裏插入圖片描述
  • 來全面檢查一下數據是否有缺失,對每個字段逐行檢查是否有缺失值,通過結果可知只有populationstate列有缺失值;
    在這裏插入圖片描述
  • 查看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 **********#

數據集下載https://github.com/jakevdp/data-USstates/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章