EduCoder Pandas合并数据集 第三关:案例:美国各州的统计数据

文章目录

      • 任务描述
      • 编程要求
      • 测试说明


任务描述

本关为练习关卡,请按照编程要求完成任务,获取美国各州2010年的人口密度排名。

编程要求

  • 使用read_csv()函数读取step3文件夹中的state-population.csv(pop)state-areas.csv(areas)state-abbrevs.csv(abbrevs)文件;
    EduCoder Pandas合并数据集 第三关:案例:美国各州的统计数据_第1张图片
    EduCoder Pandas合并数据集 第三关:案例:美国各州的统计数据_第2张图片EduCoder Pandas合并数据集 第三关:案例:美国各州的统计数据_第3张图片
  • 合并popabbrevs。我们需要将popstate/region列与abbrevsabbreviation列进行合并,还需要通过how='outer'确保数据没有丢失,得到合并后的结果,发现有一个重复列需要删除,所以,删除abbreviation列;
    EduCoder Pandas合并数据集 第三关:案例:美国各州的统计数据_第4张图片
  • 来全面检查一下数据是否有缺失,对每个字段逐行检查是否有缺失值,通过结果可知只有populationstate列有缺失值;
    EduCoder Pandas合并数据集 第三关:案例:美国各州的统计数据_第5张图片
  • 查看population这一列为缺失值的特征。通过结果可以得到好像所有的人口缺失值都出现在2000年之前的波多黎各,此前并没有统计过波多黎各的人口;
    EduCoder Pandas合并数据集 第三关:案例:美国各州的统计数据_第6张图片
  • 从上面的结果可以发现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,连接方式为左连接;
    EduCoder Pandas合并数据集 第三关:案例:美国各州的统计数据_第7张图片
  • 检查缺失值,从结果中可以发现,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/

你可能感兴趣的:(EduCoder,python,数据分析)