Pandas数据预处理与数据重塑案例
前言
预处理是数据分析中不可缺少的一部分,我们日常得到的数据多半是规整的,只有得到想要的相应格式的数据,才能进行后续的探索性分析和建模。以下是我在一个小的项目中部分数据预处理的过程,在这里记录下来方便我后续查看,也希望能给刚入门pandas的朋友们提供一些帮助。
本案例内容主要使用python的pandas进行操作,涉及知识包括数据框的增删查改、批量读取数据、变量类型的转换、数据框的重塑与合并。本案例中并没有介绍pandas函数的具体用法,但给出了完整的预处理过程和注释,不熟悉的同学可以自己尝试一下。
数据介绍和任务要求
数据包括2004-2016年的流感数据,数据展示如下
逐年流感数据文件夹
单年流感数据
各年各省市的人口数据展示如下
人口数据
任务要求:
- 读取2004-2016年的流感数据,并拼接为一个数据框
- 读入人口数据,按年份和地区对流感数据填充人口数
为想亲自上手操作的朋友们提供了数据的百度云链接,建议先自己尝试后在阅读后续代码。
链接:https://pan.baidu.com/s/1ALHiIk60_g1p9zjSBRvQ9Q 密码:cqsk
加载相关包
import pandas as pd
import numpy as np
import os
import re
流感数据的读取与清洗
读取第一年流感数据
首先读取第一年的数据,并展示查看数据查看其格式
os.chdir('C:/Users/CCC/Desktop/') # 设置工作路径为C盘桌面
dat0 = pd.read_csv("by_year/2004.csv", encoding = "gbk") # 读取数据,命名为dat0
dat0.head() # 展示数据前5行
Unnamed: 0 | Unnamed: 1 | Unnamed: 2 | Unnamed: 3 | Unnamed: 4 | Unnamed: 5 | |
---|---|---|---|---|---|---|
0 | NaN | NaN | 流行性感冒 | NaN | NaN | NaN |
1 | NaN | 地区 | 发病数 | 死亡数 | 发病率 | 死亡率 |
2 | NaN | 全国 | 49496 | 15 | 3.8077 | 0.0012 |
3 | NaN | 北京市 | 8 | 0 | 0.0540 | NaN |
4 | NaN | 天津市 | 13 | 0 | 0.1399 | NaN |
dat0.tail() # 展示数据后5行
Unnamed: 0 | Unnamed: 1 | Unnamed: 2 | Unnamed: 3 | Unnamed: 4 | Unnamed: 5 | |
---|---|---|---|---|---|---|
30 | NaN | 甘肃省 | 978 | 0 | 3.7416 | NaN |
31 | NaN | 青海省 | 230 | 1 | 4.2627 | 0.0185 |
32 | NaN | 宁夏 | 193 | 0 | 3.3051 | NaN |
33 | NaN | 新疆 | 95 | 0 | 0.5106 | NaN |
34 | 2018年9月10日 下午9:09 | NaN | NaN | NaN | NaN | NaN |
从这里我们可以看出数据框的列名与实际需要的列名不符,并且数据框头尾均有不需要的空行。
对第一年的数据进行预处理
针对上一步中所看出的现象对第1年的数据进行预处理,主要的步骤是重塑列名以及删除多余的列。
dat0.drop("Unnamed: 0", axis =1, inplace= True) # 删除第一列
col_name = dat0.iloc[1] # 选取真实列名所在的第1行
dat0.columns = col_name # 更改列名
dat0.drop([0, 1, len(dat0)-1], axis =0, inplace= True) # 删除多余的行
dat0.head() # 展示数据的前5行
1 | 地区 | 发病数 | 死亡数 | 发病率 | 死亡率 |
---|---|---|---|---|---|
2 | 全国 | 49496 | 15 | 3.8077 | 0.0012 |
3 | 北京市 | 8 | 0 | 0.0540 | NaN |
4 | 天津市 | 13 | 0 | 0.1399 | NaN |
5 | 河北省 | 1923 | 0 | 2.8283 | NaN |
6 | 山西省 | 57 | 0 | 0.1720 | NaN |
查看展示出的数据,可以发现据的index被删除行的时候弄乱了,于是在这一部分我们对index进行重置,并对数据新增加年份变量。
dat0.reset_index(inplace = True, drop=True) # 重新设置被打乱的index
dat0["年份&