需求:
- 导入文件,查看原始数据
- 将人口数据和各州简称数据进行合并
- 将合并的数据中重复的abbreviation列进行删除
- 查看存在缺失数据的列
- 找到有哪些state/region使得state的值为NaN,进行去重操作
- 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
- 合并各州面积数据areas
- 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
- 去除含有缺失数据的行
- 找出2010年的全民人口数据
- 计算各州的人口密度‘
- 排序,并找出人口能密度最高的州
1、导入文件,查看原始数据
import numpy as np
import pandas as pd
from pandas import DataFrame
##导入文件,查看原始数据
abb=pd.read_csv('./state-abbrevs.csv')#state(州的全称)abbreviation(州的简称)
abb.head()
area=pd.read_csv('./state-areas.csv')#state州的全称,area(sq.mi)州的面积
area.head()
pop=pd.read_csv('./state-population.csv')#state/region简称,ages年龄,year时间,population人
pop
2、将人口数据和各州简称数据进行合并
-
merge()函数的用途用法:
-
DataFrame1.merge(DataFrame2, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(’_x’, ‘_y’))
-
具体参数说明:
参数 | 说明 |
how | 默认为inner,保留主键一致的行,outer不仅保留主键一致的行,不一致的部分按照Nan进行保留 |
left_on | 左连接,以DataFrame1中用作连接键的列 |
right_on | 右连接,以DataFrame2中用作连接键的列 |
sort | 根据连接键对合并后的数据进行排列,默认为True |
suffixes | 对两个数据集中出现的重复列,新数据集中加上后缀_x,_y进行区别 |
#将人口数据和各州简称数据进行合并
abb_pop=pd.merge(abb,pop,left_on='abbreviation',right_on='state/region',how='outer')
abb_pop.head()
3、将合并的数据中重复的abbreviation列进行删除
- 在df.drop()里面行是axis=0是行,axis=1是列
- 其他的里面axis=1是行,axis=0是列
#将合并的数据中重复的abbreviation列进行删除
abb_pop.drop(labels='abbreviation',axis=1,inplace=True)
abb_pop.head()
4、查看存在缺失数据的
- pd.isnull()用来判断是否为缺失值,缺失值为True
- pd.notnull()也可以用来判断缺失值,非缺失值为True
- pd.isnull().any,列级别的判断,现在一列存在缺失值
- isnull和any一起,notnull和all在一起,这里axis=0表示按列
方式一:df.isnull().any(axis=0)
#查看存在缺失数据的列
#方式1:isnull,notll,any,all
abb_pop.isnull().any(axis=0)##state和population这两列存在空值
state True state/region False ages False year False population True dtype: bool
方式二:df.info()
abb_pop.info()
#少于2544的都有缺失
<class 'pandas.core.frame.DataFrame'> Int64Index: 2544 entries, 0 to 2543 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 state 2448 non-null object 1 state/region 2544 non-null object 2 ages 2544 non-null object 3 year 2544 non-null int64 4 population 2524 non-null float64 dtypes: float64(1), int64(1), object(3) memory usage: 119.2+ KB
5、找到有哪些state/region使得state的值为NaN,进行去重操作
分析:找到有哪些state/region使得state的值为NaN,进行去重操作(将state中的控制对应的简称找到,且对简称进行去重。
思考:可以将state这一列的空值对应的行数据取出,从该行数据中就可以取出简称的值
5.1 判断state这一列有没有空值
abb_pop['state'].isnull()
0 False 1 False 2 False 3 False 4 False ... 2539 True 2540 True 2541 True 2542 True 2543 True Name: state, Length: 2544, dtype: bool
5.2 将上述的布尔值作为源数据的行索引
abb_pop.loc[abb_pop['state'].isnull()]##将state中空对应的行数据取出
5.3 将简称取出
abb_pop.loc[abb_pop['state'].isnull()]['state/region']
5.4 将简称去重
- unique()函数:“去掉”容器中 相邻元素 的重复元素(不一定要求数组有序),它会把重复的元素添加到容器末尾(所以数组大小并没有改变),而返回值是去重之后的尾地址。
abb_pop.loc[abb_pop['state'].isnull()]['state/region'].unique()
#结论:只有PR和USA对应的全部数据为空值
array(['PR', 'USA'], dtype=object)
结论:只有PR和USA对应的全部数据为空值。
6、为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
思考:填充该需求中的空值可不可以使用fillna?
---不可以。fillna可以使用空的紧邻值做填充。fillna(value="xxx")使用指定的值填充空值,使用给元素赋值的方法进行填充。
6.1 先给USA全称对应的空值进行批量赋值
6.1.1将USA对应的行数据找出(行数据中就存在state的空值)
indexs=abb_pop.loc[abb_pop['state/region']=="USA"].index
indexs
abb_pop.iloc[indexs]
abb_pop.loc[indexs,'state']='United State'##将state里面的indexs进行赋值
6.1.2可以将PR的全称进行赋值
abb_pop["state/region"]=="PR"
abb_pop.loc[abb_pop["state/region"]=="PR"]##PR对应的行数据
indexs=abb_pop.loc[abb_pop["state/region"]=="PR"].index
abb_pop.loc[indexs,"state"]="PPPRRR"
7、合并各州面积数据areas
#合并各州面积数据
abb_pop_area=pd.merge(abb_pop,area,how='outer')
abb_pop_area
我们发现area(sq .mi)这一列 有空值。
8、 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行去除含有缺失数据的行
##我们发现area(sq.mi)这一列有缺失的行,找出是哪些行
abb_pop_area['area (sq. mi)'].isnull()
abb_pop_area.loc[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)
9、找出2010年的全民人口数据
query()函数进行数据筛选
- pandas的query()方法是基于DataFrame列的计算代数式,对于按照某列的规则进行过滤的操作,可以使用query方法。
#找出2010年的全民人口数据(基于df做条件查询)
abb_pop_area.query('ages=="total"&year==2010')
10、计算各州的人口密度
#计算各州的人口密度
abb_pop_area["midu"]=abb_pop_area["population"]/abb_pop_area["area (sq. mi)"]
abb_pop_area
11、排序,并找出人口能密度最高的州
sort函数
1、sort函数可以三个参数也可以两个参数,必须的头文件#include < algorithm>和using namespace std;
2、它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n)
3、Sort函数有三个参数:(第三个参数可不写)
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
abb_pop_area.sort_values(by='midu',axis=0,ascending=False).iloc[0]
##by是通过关键字排序,axis=0是按照列进行排序,ascending=true是从小到大排序为默认
复习
merge(df,left_on='',right_on='',how='outer') | 横向合并 |
df.drop(labels='',axis=1,indf.sortplace=True) | 按照列进行删除 |
df.isnull().any(axis=0) | 按照列进行删除 |
df.unique | 去掉元组中相邻元素的重复元素 |
df.query('ages=="total"&year==2010') | 条件查询 |
df.sort_valus(by=",axis=0,inplace=TRUE) | 某一列按照数值进行排序 |
df.iloc[0] | 取dataframe的第一行 |