(六) 美国各州人口数据分析

需求:

  • 导入文件,查看原始数据
  • 将人口数据和各州简称数据进行合并
  • 将合并的数据中重复的abbreviation列进行删除
  • 查看存在缺失数据的列
  • 找到有哪些state/region使得state的值为NaN,进行去重操作
  • 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
  • 合并各州面积数据areas
  • 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
  • 去除含有缺失数据的行
  • 找出2010年的全民人口数据
  • 计算各州的人口密度
  • 排序,并找出人口密度最高的五个州 df.sort_values()

 

实现:

1.首先导入文件,并查看数据样本

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

abb = pd.read_csv('../data/state-abbrevs.csv')
areas = pd.read_csv('../data/state-areas.csv')
pop = pd.read_csv('../data/state-population.csv')

2.将人口数据pop和各州简称数据abbrevs两个DataFrame进行合并, 分别依据state/region列和abbreviation列来合并

abb_pop = pd.merge(abb, pop, how='outer', left_on='abbreviation', right_on='state/region')
abb_pop.head(6)

3.将合并的数据中重复的abbreviation列进行删除

# 删除重复的列
abb_pop.drop(labels=['abbreviation'], axis=1, inplace=True)

4.查看存在缺失数据的列

abb_pop.isnull().any(axis=0) # 检查每一列中是否存在空值(True)

# 运行结果发现只有state和population中存在空值
abb_pop.loc[abb_pop['population'].isnull()] # 获取了pop空值所对应的行数据

# 查看state这一列中的空值存在情况
abb_pop['state'].isnull() # 如果该列中某一个数组元素为空值,则显示True

# 将上一步返回的布尔列表作为行索引
state=abb_pop.loc[abb_pop['state'].isnull()]
state

5.找到有哪些state/region使得state的值为NaN,进行去重操作

# 1.找出state列中哪些值为空
abb_pop['state'].isnull()
abb_pop.loc[abb_pop['state'].isnull()]  # 获取state值为空对应的行数据

# 2.将state中空值对应的简称的数据获取
abb_pop.loc[abb_pop['state'].isnull()]['state/region']
abb_pop.loc[abb_pop['state'].isnull()]['state/region'].unique()  # unique()是Serise的一个函数,该函数可以对Serise中的数组元素进行去重

6.为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN

# 可以通过简称定位到指定的state列中的空值(可以被批量赋值)
abb_pop['state/region'] == 'PR'
indexs = abb_pop.loc[abb_pop['state/region'] == 'PR'].index
abb_pop.loc[indexs, 'state'] = 'PPPRRR'
# 先定位到USA简称对应的全称的空值
abb_pop['state/region'] == 'USA'
abb_pop.loc[abb_pop['state/region'] == 'USA']  # 获取的就是简称USA对应的行数据(state列表全部为空)
indexs = abb_pop.loc[abb_pop['state/region'] == 'USA'].index
abb_pop.loc[indexs, 'state'] = 'United State'

# 简写
abb_pop.loc[abb_pop['state/region']=='PR','state']='PUERTO RICO'
abb_pop.loc[abb_pop['state/region']=='USA','state']='United State'

7.合并各州面积数据areas,使用左合并。

abb_pop_area = pd.merge(abb_pop, areas, how='left')

8.我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行

abb_pop_area.isnull().any(axis=0) # 寻找存在缺失数据的列
abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()]
# 获取行索引
indexs=abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()].index

9.去除含有缺失数据的行

abb_pop_area.drop(indexs,axis=0,inplace=True)

10.找出2010年的全民人口数据,df.query(查询语句)

data_2010 = abb_pop_area.query("year==2010 & ages=='total'")

11.计算人口密度。注意是Series/Series,其结果还是一个Series。

data_2010_index['midu'] = data_2010_index['population'] / data_2010_index['area (sq. mi)']

12.排序,并找出人口密度最高的五个州sort_values()

data_2010_index.sort_values(by='midu',axis=0,ascending=False).head()

要点总结:

  • 统一用loc()索引
  • 善于使用.isnull().any()找到存在NaN的列
  • 善于使用.unique()确定该列中哪些key是我们需要的
  • 一般使用外合并、左合并,目的只有一个:宁愿该列是NaN也不要丢弃其他列的信息

 

posted @ 2019-07-10 16:26  tiger_li  阅读(1949)  评论(0编辑  收藏  举报