(六) 美国各州人口数据分析
需求:
- 导入文件,查看原始数据
- 将人口数据和各州简称数据进行合并
- 将合并的数据中重复的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也不要丢弃其他列的信息
作者:TigerLee
出处:http://www.cnblogs.com/tiger666/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!