前言
大三上数据可视化,数据预处理作业 学习记录。
一、Series
-
通过一组数据初始化
-
获取数组表现形式和索引对象
-
初始化Series (自定义索引)
-
通过索引获取值和修改值
-
判断Series 对象是否存在该索引
-
通过字典初始化Series
-
通过字典初始化的基础上按照指定索引顺序排序,如果对应索引值不存在,则为NaN
-
NaN表示缺失值。isnull 和 notnull 可用于检测缺失数据
-
对于两个Series对象,通过相同索引可直接对相应值进行算术运算
-
Series对象及其索引设置 name 属性
二、DataFrame
- 通过等长的列表或Numpy数组初始化
- 指定索引数组,不存在的使用NaN表示
- 获取指定列
- 获取指定行
- 给指定列赋值
- 使用Series 赋值指定列,按照索引匹配赋值,不存在则赋为NaN
- 为不存在的列赋值默认会创建一个新列。
- 删除指定列,如果删除的该列不存在,则会报错
- 索引对象Index不可修改
- Index 的方法与属性
三、Pandas的主要方法
-
重建索引:创建一个适应新索引的新对象
reindex 函数的参数:
:重置索引# drop属性,默认为false。将之前的索引作为新的一列属性。 data.reset_index(inplace=True,drop=True)
-
删除指定行或列
删除任意轴上的索引值
-
索引、选取和过滤
-
填充值
-
排序与排名
排名
-
统计与汇总
-
相关系数与协方差
-
NaN的处理方法
四、作业要求即代码实现
根据所给的2004-2016年流感数据,按照数据预处理PPT的要求,完成流感数据的预处理及合并操作。
实现效果图:
代码如下: 使用Jupyter Notebook 编写。(代码注解更为实用)
from pandas import Series, DataFrame
import pandas as pd
import numpy as np
import os
basePath = "F:/firefox_download/flu_data/by_year/"
def readFluCsvData(filename):
# 用pandas读入csv文档时,会出现中文解析问题,加上 encoding='gbk' 即可
data = pd.read_csv(basePath+filename,encoding='gbk')
# 暴力修改列名
data.columns = ['tmp','地区','发病数','死亡数','发病率','死亡率']
# 去除多余的列
# del data['tmp']
# data = data.drop('tmp',axis=1)
data.drop('tmp',axis=1,inplace=True)
# 去除多余的行
# data = data.drop([0,1])
data.drop([0,1],inplace=True)
data.drop(data.tail(1).index,inplace=True) # data.tail(n).index 获取末尾n行的索引
# 填充NaN为0
# data = data.fillna(0)
data.fillna(0,inplace=True)
# 重置索引。drop属性,默认为false。将之前的索引作为新的一列属性。
data.reset_index(inplace=True,drop=True)
year = filename.split(".")[0]
# 增加年份属性
data['年份'] = year+'年'
# 对整个DataFrame 的内容去除空格
data.replace('\s+','',regex=True,inplace=True)
return data
def readYearPeopleData(filename):
people = pd.read_csv("F:/firefox_download/flu_data/"+filename, encoding='gbk',header=None,sep='\t')
people.columns = ['data']
people = people['data'].str.split(',',expand=True)
# 去除头三行
people.drop(people.head(3).index, inplace=True)
# 去除尾两行
people.drop(people.tail(2).index, inplace=True)
# 对整个DataFrame 的内容去除空格
people.replace('\s+','',regex=True,inplace=True)
# 将当前第一行作为列表名称
array = np.array(people) # 将people转换为list对象
list = array.tolist() # 将array转换为list
list = list[0] # 获取第一行的数据
people.columns = list
people.drop([3],inplace=True)
# 重置索引。drop属性,默认为false。将之前的索引作为新的一列属性。
people.reset_index(inplace=True,drop=True)
# 统一地区名的格式
people.loc[people['地区'] == '内蒙古自治区','地区'] = '内蒙古'
people.loc[people['地区'] == '广西壮族自治区','地区'] = '广西'
people.loc[people['地区'] == '西藏自治区','地区'] = '西藏'
people.loc[people['地区'] == '宁夏回族自治区','地区'] = '宁夏'
people.loc[people['地区'] == '新疆维吾尔自治区','地区'] = '新疆'
# 去除多余列
extraColumns = ['2003年','2002年','2001年','2000年','1999年','1998年','1997年']
people.drop(['2003年','2002年','2001年','2000年','1999年','1998年','1997年'],axis=1,inplace=True)
# 以上只是单纯的读取了people.csv中的值,还需转为指定格式,才能合并
haha = DataFrame(np.arange(3).reshape(1,3))
# 需转为这种格式才能合并
haha.columns = ['地区','年份','总人口数']
# 获取地点集合
locations = people['地区'].tolist()
# 获取年份集合
years = people.columns.tolist()[1:14]
# 年份集合的个数
yearNum = len(years)
for location in locations:
hat = DataFrame(np.arange(yearNum*3).reshape(yearNum,3))
hat.columns = ['地区','年份','总人口数']
hat['地区'] = location
hat['年份'] = years
for year in years:
# 获取people表中的对应地区的索引值
in1 = people[people['地区'] == location].index.tolist()[0]
# 获取被拼接表的对应年份的索引值
in2 = hat[hat['年份'] == year].index.tolist()[0]
# 获取people表中的对应地区对应年份的总人口数
num = people.loc[in1,year]
# 设置被拼接表的对应地区对应年份的总人口数
hat.loc[in2,'总人口数'] = num
# 进行拼接
haha = pd.concat([haha,hat])
# 重新设置索引
haha.reset_index(inplace=True,drop=True)
# 删除多余的第一行
haha.drop([0],inplace=True)
return haha
# 获取指定路径下的所有文件名
myListDir = os.listdir(basePath)
# 获取第一个csv的数据
data = readFluCsvData(myListDir[0])
# 删除myListDir中第一个csv的元素
del myListDir[0]
# 遍历文件列表,获取所有数据
for myDir in myListDir:
tmp = readFluCsvData(myDir)
data = pd.concat([data,tmp], ignore_index=True)
# 统一地区名的格式
data.loc[data['地区'] == '黑龙江','地区'] = '黑龙江省'
# 对指定的列进行计数
# data['地区'].value_counts()
people = readYearPeopleData("people.csv")
result = pd.merge(data,people,on=['地区','年份'])
result