- 需求:
- 导入文件,查看原始数据
- 将人口数据和各州简称数据进行合并
- 将合并的数据中重复的abbreviation列进行删除
- 查看存在缺失数据的列
- 找到有哪些state/region使得state的值为NaN,进行去重操作
- 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
- 合并各州面积数据areas
- 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
- 去除含有缺失数据的行
- 找出2010年的全民人口数据
- 计算各州的人口密度
- 排序,并找出人口密度最高的五个州 df.sort_values()
- 所需环境:jupyter
代码和分析如下:
#导入需要的包 ,如果tab不出来,则需要进行相关包的安装
import numpy as np
import pandas as pd
from pandas import DataFrame
#导入文件,查看原始数据
#三个文件,分别是state-abbrevs.csv,state-areas.csv,state-population.csv
abb = pd.read_csv('./data/state-abbrevs.csv') #state(州的全称) abbreviation(州的简称)
#abb
area = pd.read_csv('./data/state-areas.csv') #state 州的全称 area (sq. mi)(州的面积)
#area
population = pd.read_csv('./data/state-population.csv')# state/region 州的简称 ages年龄 year时间 population 人口数量
#population
原始数据如下图:
?
?
#将人口数据和各州简称数据进行合并
#dataframe的merge是按照两个dataframe共有的column进行连接,两个dataframe必须具有同名的column
#abbreviation和state/regions是内容相同但列索引不同,使用left_on和right_on手动指定merge中左右两边的哪一列作为连接的列
abb_pop = pd.merge(abb,population,left_on='abbreviation',right_on='state/region',how='outer') #outer取并集
abb_pop
#将合并的数据中重复的abbreviation列进行删除
#drop进行删除,labels是指要删除的标签,一个或者是列表形式的多个,axis是指处哪一个轴,columns是指某一列或者多列,level是指等级,针对多重索引的情况,inplaces是否替换原来的dataframe
abb_pop.drop(labels='abbreviation',axis=1,inplace=True)
#查看存在缺失数据的列
#方式一:isnull(),notnull(),any,all
abb_pop.isnull().any(axis=0)
#state population 这两列中存在空值
#方式二:直接查看这个表的信息
abb_pop.info()
#找到有哪些state/region使得state的值为NaN,进行去重操作(将state中的空值对应的简称找到,且对简称进行去重)
#思路:可以将state这一列中的空值对应的行数据取出,从该行数据中取出简称的值
#1.定位state中的空值
abb_pop['state'].isnull()
#2.将上述的布尔值作为行索引
abb_pop.loc[abb_pop['state'].isnull()]
#3.取出简称
abb_pop.loc[abb_pop['state'].isnull()]['state/region']
#4.对简称去重
abb_pop.loc[abb_pop['state'].isnull()]['state/region'].unique() #unique 去重
#array(['PR', 'USA'], dtype=object) 只有['PR', 'USA']对应的全称为空值
#为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
#思考:填充需求中的空值可以不可以使用fillna?
# - 不可以,fillna可以使用空的紧邻值做填充。fillna(value=‘xxx’)使用指定的值填充空值
#使用元素赋值的方式进行填充
#1.先给USA的全称对应的空值进行批量赋值
#1.1将USA对应的行数据找出(行数据就在state的空值)
abb_pop['state/region'] == 'USA'
#1.2找出USA对应的行数据的索引
indexs = abb_pop.loc[abb_pop['state/region'] == 'USA'].index
#1.3把usa索引所在的行的state列赋值为全称
abb_pop.loc[indexs,'state'] = ' United States of America'
#PR列同理
abb_pop['state/region'] == 'PR'
indexs = abb_pop.loc[abb_pop['state/region'] == 'PR'].index
#后面的全称随便填的,只要不是空值就行
abb_pop.loc[indexs,'state'] = 'PPPPRRR'
abb_pop.iloc[indexs]
#合并各州面积数据areas
abb_pop_area = pd.merge(abb_pop,area,how='outer')
abb_pop_area
# 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
abb_pop_area['area (sq. mi)'].isnull()
indexs = abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()].index
# 去除含有缺失数据的行
abb_pop_area.drop(labels=indexs,axis=0,inplace=True)
# 找出2010年的全民人口数据
#DataFrame.query(expr, inplace=False, **kwargs)query中可以写条件查询语句
abb_pop_area.query('ages == "total" & year == 2010')
# 计算各州的人口密度(各州人口总数除以各州面积)
abb_pop_area['midu'] = abb_pop_area['population'] / abb_pop_area['area (sq. mi)']
# 排序,并找出人口密度最高的五个州 df.sort_values()
abb_pop_area.sort_values(by='midu',axis=0,ascending=False).iloc[0]['state']
?
|