DataFrame基础操作巩固——人口分析案例

需求:

  • 导入文件,查看原始数据
  • 将人口数据和各州简称数据进行合并
  • 将合并的数据中重复的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的第一行

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值