5(1)

2020-03-01 282浏览

  • 1.第 5 周:数据汇总与统计 (2) 徐波 xubo@dhu.edu.cn
  • 2.课程回顾 数据分析技术
  • 3.2. Pandas 数据结构 什么是 pandas ? • pandas 是基于 python 的数据分析工具包 • Series 数据结构用于处理一维数据 • DataFrame 数据结构用于处理二维数据和高维数据 • 汇集多种数据源数据、处理缺失数据 • 对数据进行切片、聚合和汇总统计 • 实现数据可视化 • 使用前需要导入 >>> import pandas as pd • 为方便使用 Series 和 DataFrame ,将其导入本地命名空间 >>> from pandas import Series, DataFrame
  • 4.2. Pandas 数据结构 Series 数据结构 • Series 是类似于数组的一维数据结构,由索引( index )和值( values )两个相关联的 数组组成: Series 创建 Series ( [data,index,....] ) data : Python 的列表或 Numpy 的一维 ndarray 对象 index :列表,若省略则自动生成 0 ~n-1 的序号标签
  • 5.2. Pandas 数据结构 Series 数据选取方法 选取类型 索引名选取 基于位置选取 条件筛选 选取方法 说明 obj [ index ] 选取某个值 obj [ indexList ] 选取多个值 obj [ loc ] 选取某个值 obj [ locList ] 选取多个值 obj [a:b,c ] 选取位置 a~(b-1) 以及 c 的值 obj [ condition ] 选取满足条件表达式的值 Series 的索引为数字,基于位置序号访问需要使用 iloc 方式
  • 6.2. Pandas 数据结构 例题 3-2 2. 球员身高修改 >>> height['13'] = 188 >>> height['13'] # 将 13 号队员的身高修改为 188 188 >>> height[1:3] = 160 >>> height 13 14 7 2 9 188 160 160 178 185 # 修改位置 1 、 2 的数据,标量赋值
  • 7.2. Pandas 数据结构 例题 3-2 3. 增加新球员 >>> a = Series([190,187], index=['23','5']) >>> new = height . append( a ) >>> new 13 14 7 2 9 23 5 188 160 160 178 185 190 187 Series 不能直接添加新数据 append() 函数将两个 Series 拼接产产 生一个新的 产 产 产 产 Series 不改变原 Series >>> height 13 188 14 160 7 160 2 178 9 185
  • 8.2. Pandas 数据结构 例题 3-2 4. 删除离队球员 >>> new = height . drop( ['13', '9'] ) 员数据 >>> new 14 7 2 160 160 178 Series 的 drop() 函数缺省不删除原始对象的数据 >>> height 13 188 14 160 7 160 2 178 9 185 # 删除 13 号球
  • 9.2. Pandas 数据结构 例题 3-2 Series 对象创建后,值可以修改,索引也修改,用新的列表替换即可。 5. 更改球员球衣号码 >>> height.index=[13,14,7,2,9] 字索引 13 14 7 2 9 188 160 160 178 185 Series 的索引为数字,基于位置序号访问需要使用 iloc 方式 >>> height.iloc[0] 188 # 注意这里是数 >>> height 13 188 14 160 7 160 2 178 9 185
  • 10.2. Pandas 数据结构 DataFrame 数据结构 • DataFrame 包括值( values )、行索引( index )和列索引( columns ) 3 部分: DataFrame 创建方法: DataFrame ( data , index = […] , columns=[…] ) data :列表或 NumPy 的二维 ndarray 对象 index , colunms :列表,若省略则自动生成 0 ~n-1 的序号标签
  • 11.2. Pandas 数据结构 DataFrame 数据选取方法 选取类型 索引名选取 位置序号选取 选取方法 说明 obj[ col ] 选取某列 obj[ colList ] 选取某几列 obj.loc[ index, col ] 选取某行某列 obj.loc[ indexList, colList ] 选取多行多列 obj.iloc[ iloc, cloc] 选取某行某列 obj.iloc[ ilocList, clocList ] 选取多行多列 obj.iloc[a:b,c:d] 选取 a~(b-1) 行 , c~(d-1) 列 obj.loc[ condition, colList ] 使用索引构造条件表达式 选取满足条件的行 条件筛选 obj.iloc[ condition, clocList ] 使用位置序号构造条件表达式 选取满足条件的行
  • 12.2. Pandas 数据结构 例题 3-4 •使用例 3-3 创建的学生 DataFrame 产象 , 产产产学生信息的 产 产 产 产 产产产、增加、 产 产 产 产产除和修改。 产产产 产 1. 学生信息查询 >>> students.loc[ 1, 'age'] # 查询 1 号同学的年龄 19 >>> students.loc[[1,3],['height','weight']] # 查询 1 、 3 号同学的身高 和体重 1 3 height 170 175 weight 68 65 >>> students.iloc[[0,2],[0,1]] 1 3 age 19 18 height 170 175 # 查询第 0 、 2 行的第 0 、 1 列的值
  • 13.2. Pandas 数据结构 例题 3-4 >>> students.loc[ : , ['height','weight']] 1 2 3 height 170 165 175 weight 68 65 65 >>> students[['height', 'weight']] 1 2 3 height 170 165 175 2 3 2 3 有同学的身高和体重,常用形式 # 通产产 切片抽取某些行和列的数据 产 产 产 产 产产 产 产 产 产产 height 165 175 >>> students[1:3 ] age 20 18 # 产产所 weight 68 65 65 >>> students.iloc[1:, 0:2] age 20 18 #“:” 表示所有行的数据 height 165 175 weight 65 65 # 抽取行数据,列的“ :” 可以省略
  • 14.2. Pandas 数据结构 例题 3-4 # 筛选身高大于 168 的同学,显示其身高和体重值 >>> mask = students['height']>=168 >>> mask 1 2 3Name:True False True height,dtype:bool #mask 对象索引为 2 的行值为 False ,对应 students 索引为 2 的行未选中 >>> students.loc[ mask, ['height','weight'] ] 1 3 height 170 175 weight 68 65
  • 15.2. Pandas 数据结构 例题 3-4 2. 增加学生信息 # 列索引标签不存在,添加新列;存在则为值修改 >>> students['expense'] = [1500,1600,1200] >>> students 1 2 3 age 19 20 18 height 170 165 175 weight 68 65 65 # 为学生增加月消费数据 expense 1500 1600 1200 DataFrame 对象可以添加新的列,但不能直接增加新的行 增加行需要通过两个 DataFrame 对象的合并实现(见章节 3. 5)
  • 16.>>> students 2. Pandas 数据结构 例题 3-4 age height weight expense 1 19 170 68 1500 2 20 165 65 1600 3 18 175 65 1200 3. 修改学生信息 >>> students['expense'] = 1000 >>> students 1 2 3 age 19 20 18 height 170 165 175 weight 68 65 65 # 选中月消费列,用标量赋值 expense 1000 1000 1000 >>> students.loc[1, :] = [21,180,70,20] 据,使用列表赋值 >>> students 1 2 3 age 21 20 18 height 180 165 175 weight expense 70 20 65 1000 65 1000 # 修改 1 号同学数
  • 17.2. Pandas 数据结构 例题 3-4 3. 修改学生信息 # 筛选不合理数据,重新赋值 >>> students age height weight expense 1 21 180 70 20 2 20 165 65 1000 3 18 175 65 1000 >>> students.loc[students['expense']<500, 'exp ense' ] = 1200 >>> students age height weight expense 1 21 180 70 1200 2 20 165 65 1000 3 18 175 65 1000
  • 18.>>> students 2. Pandas 数据结构 例题 3-4 1 age 21 180 70 1200 2 20 165 65 1000 3 18 175 65 1000 4. 删除学生信息 height weight expense 缺省不修改原始数据对象 >>> students.drop(1, axis=0) age height 2 20 165 3 18 175 weight 65 expense 1600 65 1200 #axis=0 表示行 >>> students.drop('expense', axis=1)# 删除 expense 列, axi s=1 表示列 age height 1 21 180 2 20 165 4 18 175 weight 70 65 65 >>> students.drop([1, 2], axis=0) age 3 18 height 175 weight 65 expense 1000 # 删除多行,给出行索引名列表
  • 19.>>> students 2. Pandas 数据结构 例题 3-4 4. 删除学生信息 age height weight expense 1 21 180 70 1200 2 20 165 65 1000 3 18 175 65 1000 如果需要直接删除原始对象的行或列,设置参数 inplace=True # 删除多列,并修改 students 对象 >>> students.drop(['age','weight'], axis=1, in place=True) height expense 1 180 1200 2 165 1000 3 175 1000 >>> students height expense 1 180 1200 2 165 1000 4 175 1000
  • 20.本周课程 数据分析技术
  • 21.3. 数据文件读写
  • 22.3. 数据文件读写 支持的文件格式? Pandas 支持多种格式的数据导入和导出  CSV 、 TXT 、 Excel 、 HTML 等文件格式  MySQL 、 SQLServer 等数据库格式  JSON 等 Web API 数据交换格式 常用 CSV 、 TXT 、 Excel 3 种文件的数据读写 东华大学计算机科学与技术学院 22
  • 23.3. 数据文件读写 读取 CSV 文件 CSV 是一种特殊的文本文件,通常使用: 逗号:字段之间的分隔符 换行符:记录之间分隔符 使用传统 Open 方法 import pandas as pd from pandas import DataFrame path1 = "student1.csv" full_list = [] f1 = open(path1, 'r', encoding = "utf-8") for line1 in f1.readlines()[1:]: line1 = line1.rstrip() words1 = line1.split(",") full_list.append(words1) new1 = DataFrame(full_list, columns=[" 序号 "," 性别 "," 年龄 "," 身高 "," 体 重 "," 省份 "," 成绩 "]) 东华大学计算机科学与技术学院 23
  • 24.3. 数据文件读写 读取 CSV 文件 CSV 是一种特殊的文本文件,通常使用: 逗号:字段之间的分隔符 换行符:记录之间分隔符 读取 CSV 文件方法 read_csv( file, sep=',', header='infer’, index_col=None, names=None, skiprows,...) 参数说明: file 字符串,文件路径和文件名 sep 字符串,每行各数据之间的分隔符,默认为‘ ,’ header header=None ,文件中第一行不是列索引 index_col 数字,用作行索引的列 name 列表,定义列索引,默认文件中第一行为列索引 skiprows 整数或列表,需要忽略的行数或需要跳过的行号列表 东华大学计算机科学与技术学院 24
  • 25.3. 数据文件读写 例题 3-5 从 students1.csv 文件读出数据,保存为 DataFrame 对象 >>> student = pd.read_csv( 'data\student1.csv ') >>> student[-3:] # 显示最后 3 条数据 序号 2 3 3 4 4 5 性别 年龄 身高 体重 省份 成绩 male 22 180 62 FuJian male 20 177 72 LiaoNing male 20 172 74 ShanDong 57 79 91 文件中每个同学已有序号,读取时作为行索引 >>> student = pd.read_csv( 'data\student1.csv ', index_col = 0 ) >>> student[ :3] # 从开始到序号为 3 的行 性别 年龄 身高 体重 省份 成绩 序号 1 male 2 male 3 male 东华大学计算机科学与技术学院 20 22 22 170 180 180 70 71 62 LiaoNing GuangXi FuJian 71 77 5 25
  • 26.3. 数据文件读写 文本文件编码格式 文本文件包含中文,使用“ UTF-8” 编码格式保存  其他格式, Python 3 读取时报“ utf-8” 错误 保存方法  用“记事本”程序打开文件,选择“文件”的“另存为”菜单  点击最下方的“编码”下拉列表  产产“ UTF-8” →“ 保存” 东华大学计算机科学与技术学院 26
  • 27.3. 数据文件读写 读取文本文件 不是以逗号隔开的文本文件,读取时需要设置分隔符参数 sep 分隔符既可以是指定字符串,也可以是正则表达式 常用的通配符 东华大学计算机科学与技术学院 通配符 描述 \s 空格等空白字符 \S 非空白字符 \t 制表符 \n 产行 符 \d 数字 \D 非数字字符 27
  • 28.3. 数据文件读写 例题 3-6 从 student2.txt 文件中读取数据,保存至 DataFrame 对象  student2.txt 以制表符为分割符  文件中不包含列索引 ‘/t’ 表示制表 符 >>> colNames = [' 性别 ',' 年龄 ',' 身高 ',' 体重 ',' 省份 ',' 成绩 '] >>> student = pd.read_csv('data\student2.txt', sep='\t', index_col=0, header=None, names= colNames ) >>> student[:2] 性别 年龄 身高 体重 省份 成绩 序号 1 male 20 170 70 LiaoNing 71 2 male 22 180 71 GuangXi 77 东华大学计算机科学与技术学院 指明: 1 )文件中不包括列索引 2 )列索引名由指定列表给 出 28
  • 29.3. 数据文件读写 保存 CSV 文件 数据保存到文件 to_csv (file, sep, mode, index, header,...) 参数产 明: 产产 file 文件路径和文件名 sep 分隔符,默认产 逗号 产产 mode 产 出 模式, w 为导出 index 是否产 出行索引,默认 产 产 产 产 产 产 产 产 True header 是否导出列索引,默认为 True 东华大学计算机科学与技术学院 到新文件, a 为追 加到有文件 现 29
  • 30.3. 数据文件读写 例题 3-7 新建 DataFrame 对象 student ,并将数据保存到 out.csv 文件 >>> data = [[19,68,170],[20,65,165],[18,65,175]] >>> student =DataFrame( data,index=[1,2,3], columns=['age','weight','height'] ) >>> student.to_csv('out.csv', mode='w', header=True, i ndex=False) 东华大学计算机科学与技术学院 30
  • 31.3. 数据文件读写 读取 Excel 文件 从 Excel 文件中读取数据的函数类似 CSV 文件 需给出数据所在的 Sheet 表单名 读取方法: read_excel(file, sheetname, ...) 东华大学计算机科学与技术学院 31
  • 32.3. 数据文件读写 例题 3-8 从如图所示的 student3. xlsx 文件“ Group1” 产中产产取数据,保存至 产 产 产 产 产 产D ataFrame 对象 # 将序号列作为 index ,跳过前 3 行 >>> student = pd.read_excel( 'data\student3.xlsx', 'Group1', index_col=0, skiprows=3 ) >>> student[:2] 性别 年龄 身高 体重 省份 成绩 序号 1 male 20 170 70 LiaoNing 71 2 male 22 180 71 GuangXi 77 东华大学计算机科学与技术学院 skiprows = 3 ,忽略前 3 行,即 0 、 1 、 2 行忽略指定行:给出行号列 表 如 : 忽略第 2 、 3 行, skiprows=[1,2] 32
  • 33.4. 数据清洗
  • 34.4. 数据清洗 数据清洗? 数据清洗对采集的数据进行重新审查和校验  删除重复信息、纠正存在的错误,保证数据一致性 例:数据缺失问题、数据错误问题、数据重复问题 数据缺失 数据错误 数据重复 东华大学计算机科学与技术学院 34
  • 35.4. 数据清洗 缺失数据处理 主要有数据滤除和数据填充两类方法 1. 数据滤除 obj.dropna(axis, how, thresh,...) 参数说明: axis 0 表示按行滤除, 1 按列滤除,默认 axis=0 how 'all' 表示滤除全部值都为 NaN 的行或列 thresh 只留下有效数据大于等于 thresh 值的行或列 东华大学计算机科学与技术学院 35
  • 36.4. 数据清洗 例题 3-9 从文件 studentsInfo.xlsx 的“ Group1” 表单中读取数据,滤除部分缺失数据,填充部分缺 失数据。 >>> stu = pd.read_excel('data\studentsInfo.xlsx', 'Group1',index_col= 0) >>> stu 性别 年龄 身高 体重 省份 成绩 月生活费 课程兴趣 案例教学 序号 1 male 20.0 170 70.0 LiaoNing NaN 800.0 5 4 2 male 22.0 180 71.0 GuangXi 77.0 1300.0 3 4 3 male NaN 180 62.0 FuJian 57.0 1000.0 2 4 4 male 20.0 177 72.0 LiaoNing 79.0 900.0 4 4 5 male 20.0 172 NaN ShanDong 91.0 NaN 5 5 ...... 缺失数据被表示为 NaN , 赋值时使用 np.nan  样本容量大,忽略缺失行  样本容量较小,采用合适的值来填充 东华大学计算机科学与技术学院 36
  • 37.4. 数据清洗 例题 3-9 续 >>> stu.dropna() # 缺省删除包含有缺失值的行(序号 1 、 3 、 5 的行被滤除) 性别 年龄 身高 体重 省份 成绩 月生活费 课程兴趣 案例教学 序号 2 male 22.0 180 71.0 GuangXi 77.0 1300.0 4 male 20.0 177 72.0 LiaoNing 79.0 900.0 6 male 20.0 179 75.0 YunNan 92.0 950.0 3 4 5 4 4 5 ...... >>> stu.dropna(thresh=8) # 保留有效数据个数≥ 8 的行 ( 序号 5 的行被 滤除 ) 性别 年龄 身高 体重 省份 成绩 月生活费 课程兴趣 案例教学 序号 1 male 20.0 170 70.0 LiaoNing NaN 800.0 2 male 22.0 180 71.0 GuangXi 77.0 1300.0 3 male NaN 180 62.0 FuJian 57.0 1000.0 4 male 20.0 177 72.0 LiaoNing 79.0 900.0 6 male 20.0 179 75.0 YunNan 92.0 950.0 ...... 东华大学计算机科学与技术学院 5 3 2 4 5 4 4 4 4 5 37
  • 38.4. 数据清洗 缺失数据处理 2. 数据填充 填充有两种基本思路:  用默认值填充  用已有数据的均值 / 中位数来填充 格式: obj.fillna (value, method, inplace...) 参数说明: value 填充产产 ,可以是 产 产 产 产产 量、字典、 产产 产产 Series 或 DataFrame method 'ffill' :同列前一行数据填充缺失值, 'bfill' :用后一行数据填充 inplace 是否修改原始数据的值,默认为 False ,产生一个新的数据对象 东华大学计算机科学与技术学院 38
  • 39.4. 数据清洗 例题 3-9 续 案例 3-1“ 年龄”和“体重”列有缺失数据  年龄用默认值填充  体重用平均值来填充 列填充,构造 { 列索引名 : 值 } 形式的字典对象作为实际参数 >>> stu.fillna( {' 年龄 ':20, ' 体重 ':stu[' 体重 '].mean()} ) 性别 年龄 身高 体重 省份 成绩 月生活费 课程兴趣 案例教学 序号 1 male 20.0 170 70.000000 LiaoNing NaN 800.0 5 4 2 male 22.0 180 71.000000 GuangXi 77.0 1300.0 3 4 3 male 20.0 180 62.000000 FuJian 57.0 1000.0 2 4 4 male 20.0 177 72.000000 LiaoNing 79.0 900.0 4 4 5 male 20.0 172 63.666667 ShanDong 91.0 NaN 5 5 ....... 东华大学计算机科学与技术学院 39
  • 40.4. 数据清洗 例题 3-9 续 没有前一行, 不填充 用前一行数据替换当前行的空值 >>> stu.fillna(method='ffill') 性别 年龄 身高 体重 # 每个空值用上一行同列的值填充 省份 成绩 月生活费 课程兴趣 案例教学 序号 1 male 20.0 170 70.0 LiaoNing NaN 800.0 5 4 2 male 22.0 180 71.0 GuangXi 77.0 1300.0 3 4 3 male 22.0 180 62.0 FuJian 57.0 1000.0 2 4 4 male 20.0 177 72.0 LiaoNing 79.0 900.0 4 4 5 male 20.0 172 72.0 ShanDong 91.0 900.0 5 5 ....... 填充操作产生新的数据对象,原始数据不会被修改 直接填充原始数据中的缺失值 fillna() 增加参数设置: inplace=True 东华大学计算机科学与技术学院 40
  • 41.4. 数据清洗 去重 例题 3-10 例题:从文件 studentsInfo.xlsx 的“ Group1” 页中读取数据,去除重复数 据。 去重函数 obj.drop_duplicates() >>> stu = pd.read_excel('data\studentsInfo.xlsx’, 'Group1',index_col=0) # 去重(序号 9 的行被滤除) 性产 年产 身高 体重 省份 成产 月生活产 产程产案 趣 例教学 >>> stu.drop_duplicates() 序号 1 male 2 male ....... 8 female 10 male 东华大学计算机科学与技术学院 20.0 22.0 170 180 70.0 71.0 LiaoNing GuangXi NaN 77.0 800.0 1300.0 5 3 4 4 20.0 19.0 162 169 47.0 76.0 AnHui HeiLongJiang 78.0 88.0 1000.0 1100.0 4 5 4 5 41
  • 42.作业 1 1. 创建 50×7 的 DataFrame 对象,数据为 [10,99] 之间的随机整数; columns 为字符 a-g ;将 DataFrame 对象保存到 csv 文件中。 【提示】使用 NumPy 的随机生成函数 randint() 生成数据。 2. 海伦一直使用在线交友网站寻找适合的约会对象 , 她将交友数据存放在 datingTestSet.xls 文件中。 1 )从文件中读取有效数据保存到 Dataframe 对象中,跳过所有文字解 释行; 2 )列索引名设为 ['flymiles','videogame','icecream','type‘] ; 3 )显示读取到的前面 5 条数据; 4 )显示所有 'type' 为 'largeDoses' 的数据。 东华大学计算机科学与技术学院 42
  • 43.作业 2 1 .数据清洗。 1 )从 studentsInfo.xlsx 文件的“ Group1” 表单中读取数据; 2 )将“案例教学”列数据值全改为 NaN ; 3 )滤除每行数据中缺失 3 项以上(包括 3 项)的行; 4 )滤除值全部为 NaN 的列; 2 .数据填充。 1 )使用习题 1 的数据; 2 )使用列的平均值填充“体重”和“成绩”列的 NaN 数据; 3 )使用上一行数据填充“年龄”列的 NaN 数据; 4 )使用“中位数”填充“生活费用” NaN 数据。 【提示:】使用 df[“ 生活费用” ].median() 计算中位数。 43 东华大学计算机学院