第二章
??个人信息- kwd:info
- kwd:info
- kwd:info
ipynb下载等文件:https://wwm.lanzouf.com/iklXf023qeef
分析数据首先要处理数据,本章主要介绍Pγthon常用的数据处理方法和技巧,以及Anaconda安装Anaconda 和 Jupγter notebook 已成为资料分析的标准坏境。
本章开始进入Python介绍革之据分析工具。革命的基础分析一般都很周到Numpγ 、Scipγ 和Pandas三个包。Numpγ是Pγthon的主义值计算扩在包,主妥用来处理矩阵,宅的运算效率比到家史高效。Scipy是基于Numpy 包括线性代狄、统计等工具的科学计算包。Pandas是基于Numpγ大型数据集可以轻松操作数据分析工具。
2.1Anaconda简介
Anaconda 是Python 开源发行版主要是科学计算学计算非常好用最省心的Python 学习工具。对于学习Pyt hon 的“小白" 安装第三方库对人来说是一个折腾,但是用了Anaconda 方便多了。它预装了许多我们使用或不使用的第三方库,与它相比Python 用pip install 安装仓库也更方便。Anaconda 中增加了conda install 命令安装第三方库的方法和方法pip install 命令一样。当用户熟悉时Anaconda 将来会发现,使用conda install 命令将比使用更多pip install 命令更方便。例如,人们经常担心lxml 包的问题, 在Windows 下使用pip install 命令不能顺利安装,使用conda 命令可以。
1. 代码提示
代码提示是开发工具的必要功能。当用户需要时Spyder 只有在给出代码提示时 按下函数名的前几个字母Ta b 键,即可得到IDE 代码提示。
2. 变量浏览
变量是代码执行过程中留在内存中的数据,可以通过Spy der 对变量承载 查看数据,方便用户处理数据。
3. 图形查看
绘图是数据分析的必备技能之一。一个好的工具必须有图形绘制 的功能, Spyder 窗户还集成了绘图功能
2.2Numpy简介
Numpy 数据结构是n 维的数组对象,叫做ndarray 。在前一章中,我 我们已经知道了Python 列表也可以表示数组,但效率会随着列表数据的增加而提高 降低。
本书使用 Anaconda ,不需要单独安装 Numpy ,但因为它属于 Python 第三方工具,所以每次使用前必须在代码中加载 导入(载入)命令如下:
import numpy as np data1=[1,2,3,4,5] array1=np.array(data1) array1
array([1, 2, 3, 4, 5])
使用创建数组(矩阵)Numpy中的array新手要记得添加函数"np."。上面的代码已经列出了系统自带的列表(list)转换成Numpy中间的数组。以列表为元素的嵌套列表可以使用np.转换为多维数组,我们称之为矩阵。
具体代码如下:
data2=[[1,3,4], [2,5, 6]] array2=np.array (data2) array2
array([[1, 3, 4], [2, 5, 6]])
2.3关于Pandas
2.3.1什么是Pandas
Pandas 是Python 的一个数据分析包。最初由AQR Capital Management 于 2008 年4 2009年月开发, 年年底开源面市。目前由专注于Python 数据包开 发的PyData 开发团队继续开发和维护,属于PyData 项目的一部分。Pandas 最 它最初是作为金融数据分析工具开发的,因此, Pandas 分析时间序列 很好的支持。Pandas 面板数据的名称来自( Panel Data )和Python 数据 分析( Data Analysis ) 。Panel Data 它是经济学中关于多维数据集的术语 Pandas 中也提供了Panel Data 数据类型。
2.3.2Pandas中数据结构
Pandas 中除了Panel 数据结构还引入了两种新的数据结构1- Series 和 DataFrame ,这两种数据结构都是建立在基础上的NumPy 在此基础上。
( 1 ) Series :一维数组系列,又称序列Numpy 中的一维array 类似。 二者与Python 基本数据结构list 也很相近。
( 2 ) DataFrame :二维表格数据结构。DataFrame 理解为Series 容器。以下内容主要包括DataFrame 为主。
( 3) Panel :三维数组可以理解为DataFrame 的容器。
2.4数据准备
2.4.1数据类型
1. Logical
Logical 又叫布尔型,只有两种取值: 0 和1 ,或者真和假( True 和False ) 。 逻辑运算符有:& (与,两个逻辑型数据中,有一个为假,则结果为假〉, |(或,两个逻辑型数据中,有一个为真,则结果为真) , not (非,取反〉。
运算符 | 注释 | 运算规则 |
---|---|---|
& | 与 | 两个逻辑型数据中,其中一个数据为假, 则结果为假 |
| | 或 | 两个逻辑型数据中,其中一个数据为真, 则结果为真 |
not | 非 | 取相反值,非真的逻辑型数据为假,非假的逻辑型数据为真 |
2. Numeric
数值运算符有:+、-、*、/。
3. Character
宇符型数据一般使用单引号(")或者双引号( “” )包起来。 Python 数据类型变量命名规则如下:
( 1 )变量名可以由a~z 、A~Z、数字、下划线组成, 首字母不能是数字和 下划线;
( 2 )大小写敏感,即区分大小写;
( 3 )变量名不能为Python 中的保留字,如and 、continue 、lambda 、 or 等。
2.4.2数据结构
1. Series
Series (系列,也称序列)用于存储一行或 列的数据,以及与之相关的索引的集合 。使用方法如下:
Ser es ([数据 ,数据 ... ],index=[索引 ,索引 2, ...])
例如:
from pandas import Series
X = Series (['a',2 ,'螃蟹'], index= [1,2,3] )
X
1 a
2 2
3 螃蟹
dtype: object
一个系列允许存放多种数据类型 ,索引 Index )也可 以省略,可以通过位 置或者索引访问数据,如X[3],返回 螃蟹。 Series index 如果省略,索引号默认从 开始,也可以指定索引名 。为了 方便后面的使用和说明,此处定义可以省略的 index ,也就是默认的索引号从 开始计数,赋值给定的 index ,我们称为索引名,有时也称为行标签。
在Spyder 中写入如下代码:
from pandas import Series
A=Series([1,2,3])
print(A)
0 1
1 2
2 3
dtype: int64
from pandas import Series
A=Series(
[1,2,3],
index=[1,2,3]
)
print(A)
1 1
2 2
3 3
dtype: int64
from pandas import Series
A=Series([1,2,3],index= [ 'A','B', 'c'])
print (A)
A 1
B 2
c 3
dtype: int64
2. DataFrame
2.4.3数据导入
- 导入txt文件
read table 函数用于导入txt 文件。其命令格式如下:
read table(file, names =[歹u名1 ,列名2, ... J , sep="", ...)
其中:
- 目怆为文件路径与文件名;
- names 为列名,默认为文件中的第一行作为列名:
- sep 为分隔符,默认为空。
【例 2-1】读取(导入) txt 文件
from pandas import read_table
df = read_table(r'rz.txt',sep=" ")
df.head()
学号\t班级\t姓名\t性别\t英语\t体育\t军训\t数分\t高代\t解几 | |
---|---|
0 | 2308024241\t23080242\t成龙\t男\t76\t78\t77\t40\t2... |
1 | 2308024244\t23080242\t周怡\t女\t66\t91\t75\t47\t4... |
2 | 2308024251\t23080242\t张波\t男\t85\t81\t75\t45\t4... |
3 | 2308024249\t23080242\t朱浩\t男\t65\t50\t80\t72\t6... |
4 | 2308024219\t23080242\t封印\t女\t73\t88\t92\t61\t4... |
2. 导入csv文件
csv (Comma-Separated Values )一般称为逗号分隔值,有时也称为字符分隔 因为分隔字符也可以不是逗号,其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含有必须像二进制数字那 样被解读的数据。csv 文件由任意数目的记录组成, 记录间以某种换行符分 隔; 每条记录由字段组成, 字段间的分隔符是其他字符或字符串,最常见的是 逗号或制表符。通常, 所有记录都有完全相同的字段序列。通常都是纯文本文 件。csv 文件格式常见于手机通讯录,可以使用Excel 打开。
read_csv 函数可以导入csv 文件。其命令格式如下:
read_csv(file , names =[列名1 ,列名2, .. ] , sep="",… )
其中:
- file 为文件路径与文件名;
- names 为列名,默认为文件中的第一行作为列名;
- sep 为分隔符, 默认为空, 表示默认导入为一列。
【例2-2】读取(导入) csv文件。
示例代码如下:
from pandas import read_csv
df = read_csv(r'rz.csv',sep ="," )
df
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 2308024241 | 23080242 | 成龙 | 男 | 76 | 78 | 77 | 40 | 23 | 60 |
1 | 2308024244 | 23080242 | 周怡 | 女 | 66 | 91 | 75 | 47 | 47 | 44 |
2 | 2308024251 | 23080242 | 张波 | 男 | 85 | 81 | 75 | 45 | 45 | 60 |
3 | 2308024249 | 23080242 | 朱浩 | 男 | 65 | 50 | 80 | 72 | 62 | 71 |
4 | 2308024219 | 23080242 | 封印 | 女 | 73 | 88 | 92 | 61 | 47 | 46 |
5 | 2308024201 | 23080242 | 迟培 | 男 | 60 | 50 | 89 | 71 | 76 | 71 |
6 | 2308024347 | 23080243 | 李华 | 女 | 67 | 61 | 84 | 61 | 65 | 78 |
7 | 2308024307 | 23080243 | 陈田 | 男 | 76 | 79 | 86 | 69 | 40 | 69 |
8 | 2308024326 | 23080243 | 余皓 | 男 | 66 | 67 | 85 | 65 | 61 | 71 |
9 | 2308024320 | 23080243 | 李嘉 | 女 | 62 | 作弊 | 90 | 60 | 67 | 77 |
10 | 2308024342 | 23080243 | 李上初 | 男 | 76 | 90 | 84 | 60 | 66 | 60 |
11 | 2308024310 | 23080243 | 郭窦 | 女 | 79 | 67 | 84 | 64 | 64 | 79 |
12 | 2308024435 | 23080244 | 姜毅涛 | 男 | 77 | 71 | 缺考 | 61 | 73 | 76 |
13 | 2308024432 | 23080244 | 赵宇 | 男 | 74 | 74 | 88 | 68 | 70 | 71 |
14 | 2308024446 | 23080244 | 周路 | 女 | 76 | 80 | 77 | 61 | 74 | 80 |
15 | 2308024421 | 23080244 | 林建祥 | 男 | 72 | 72 | 81 | 63 | 90 | 75 |
16 | 2308024433 | 23080244 | 李大强 | 男 | 79 | 76 | 77 | 78 | 70 | 70 |
17 | 2308024428 | 23080244 | 李侧通 | 男 | 64 | 96 | 91 | 69 | 60 | 77 |
18 | 2308024402 | 23080244 | 王慧 | 女 | 73 | 74 | 93 | 70 | 71 | 75 |
19 | 2308024422 | 23080244 | 李晓亮 | 男 | 85 | 60 | 85 | 72 | 72 | 83 |
20 | 2308024201 | 23080242 | 迟培 | 男 | 60 | 50 | 89 | 71 | 76 | 71 |
3. 导入Excel文件
read_excel 函数可以导入Excel 文件。其命令格式如下:
read_excel (file,sheetname,header=0)
其中:
- file 为文件路径与文件名:
- sheetname 为sheet 的名称,如sheetl;
- header 为列名,默认为0 (只接收布尔型数据0 和1 ),一般以文件的 第一行作为列名。
【例2-3】 读取(导入)Excel文件
实例代码如下:
from pandas import read_excel
df =read_excel(r'i_nuc.xls',sheet_name='Sheet3')
df
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 2308024241 | 23080242 | 成龙 | 男 | 76 | 78 | 77 | 40 | 23 | 60 |
1 | 2308024244 | 23080242 | 周怡 | 女 | 66 | 91 | 75 | 47 | 47 | 44 |
2 | 2308024251 | 23080242 | 张波 | 男 | 85 | 81 | 75 | 45 | 45 | 60 |
3 | 2308024249 | 23080242 | 朱浩 | 男 | 65 | 50 | 80 | 72 | 62 | 71 |
4 | 2308024219 | 23080242 | 封印 | 女 | 73 | 88 | 92 | 61 | 47 | 46 |
5 | 2308024201 | 23080242 | 迟培 | 男 | 60 | 50 | 89 | 71 | 76 | 71 |
6 | 2308024347 | 23080243 | 李华 | 女 | 67 | 61 | 84 | 61 | 65 | 78 |
7 | 2308024307 | 23080243 | 陈田 | 男 | 76 | 79 | 86 | 69 | 40 | 69 |
8 | 2308024326 | 23080243 | 余皓 | 男 | 66 | 67 | 85 | 65 | 61 | 71 |
9 | 2308024320 | 23080243 | 李嘉 | 女 | 62 | 作弊 | 90 | 60 | 67 | 77 |
10 | 2308024342 | 23080243 | 李上初 | 男 | 76 | 90 | 84 | 60 | 66 | 60 |
11 | 2308024310 | 23080243 | 郭窦 | 女 | 79 | 67 | 84 | 64 | 64 | 79 |
12 | 2308024435 | 23080244 | 姜毅涛 | 男 | 77 | 71 | 缺考 | 61 | 73 | 76 |
13 | 2308024432 | 23080244 | 赵宇 | 男 | 74 | 74 | 88 | 68 | 70 | 71 |
14 | 2308024446 | 23080244 | 周路 | 女 | 76 | 80 | 77 | 61 | 74 | 80 |
15 | 2308024421 | 23080244 | 林建祥 | 男 | 72 | 72 | 81 | 63 | 90 | 75 |
16 | 2308024433 | 23080244 | 李大强 | 男 | 79 | 76 | 77 | 78 | 70 | 70 |
17 | 2308024428 | 23080244 | 李侧通 | 男 | 64 | 96 | 91 | 69 | 60 | 77 |
18 | 2308024402 | 23080244 | 王慧 | 女 | 73 | 74 | 93 | 70 | 71 | 75 |
19 | 2308024422 | 23080244 | 李晓亮 | 男 | 85 | 60 | 85 | 72 | 72 | 83 |
20 | 2308024201 | 23080242 | 迟培 | 男 | 60 | 50 | 89 | 71 | 76 | 71 |
4. 导入MySQL库
Python 中操作MySQL 的模块是PyMy SQL,在导入MySQL 数据之前, 需 要安装PyMySQL 模块。目前Py由on3.x 仅支持PyMySQL ,不支持MySQLdb 。 安装PyMySQL ,命令为pip install pymysql
read_sql 函数可以导入My SQL 库。其命令格式如下:
read_sql(sql,conn)
其中:
- sql 为从数据库中查询数据的SQL 语句;
- conn 为数据库的连接对象,需要在程序中选创建。
示例代码如下:
import pandas as pd
import pymysql
dbconn=pymysql.connect(
host="**********",
database="kimbo",
passwd="******",
port=3306,
charset='utf8'
)
sqlcmd="select * from tabl e name"#SQL语句
a =pd.read_sql(sqlcmd , dbconn) #利用pandas模块导入MySQL数据
dbconn.close()
b=a.head()
print(b)
下面介绍读取MySQL 数据的其他方法。
方法一:
```python
一段代码,我懒得写了
方法二:
一段代码,懒得写了
2.4.2数据导出
1. 导出csv文件
to_csv 函数可以导出 csv 文件。其命令格式如下:
to_csv (file path,sep=",", index=TRUE, header=TRUE)
其中:
- file_path 为文件路径:
- sep 为分隔符,默认是逗号:
- index 表示是否导出行序号,默认是 TR阻,导出行序号:
- header 表示是否导出列名,默认是 TRUE ,导出列名。
【例 2-4 】导出 CSV 文件。
示例代码如下:
from pandas import DataFrame
from pandas import Series
df = DataFrame(
{
'age':Series([26, 85 , 64]),
'name':Series(['Ben','John','Jerry'])
})
df
age | name | |
---|---|---|
0 | 26 | Ben |
1 | 85 | John |
2 | 64 | Jerry |
2. 导出Excel文件
to_excel 函数可以导出 Excel 文件。其命令格式如下:
to excel(file_path ,index=TRUE ,header=TRUE)
其中:
- file_path 表示文件路径;
- index 表示是否导出行序号,默认是 TRUE ,导出行序号;
- header 表示是否导出 名,默认是 TRUE ,导 出列名。
例2-5 导出Excel文件。
示例代码如下:
from pandas import DataFrame
from pandas import Series
df=DataFrame(
{
'age':Series([26,85,64]),
'name':Series(['Ben','John','Jerry'])
})
df .to_excel ('./data/01.xlsx') #默认带上index
df.to_excel('./data/02.xlsx', index= False) #无index
3. 导出到MySQL
to_sql 函数可以将文件写入到MySQL数据库。其命令格式如下:
to_sql(tableName, con =数据库连接)
其中:
- tableName 表示数据库中的表名;
- con 表示数据库的连接对象,需要在程序中先创建。
示例代码如下:
#Python3.6 下利用PyMySQL 将Data Frame 文件写入到MySQL 数据库
from pandas import DataFrame
from pandas import Series
from sqlalchemy import create_engine
#启动引擎
engine = create_engine ("mysql+pymysql://user:password@host:port/databasename?charset=utf8")
#这里一定要写成mysql +pymysql ,不要写成mysql+mysqldb
#user:password 是账户和密码, host:port 是访问地址和端口,databasename 是库名
#DtaFrame 数据
df = DataFrame ( {
' age ': Series ( [26, 85, 64 ]),' name ': Series ([' Ben ',' John ',' Jerry'])})
#存入MySQL
df.to_sql(
name ='table name',
con = engine,
if_exists ='append',
index = False,
index_label = False)
## 2.5数据处理
***数据处理是一项复杂且繁琐的工作,同时也是整个数据分析过程中最为重要的环节。***<br>
***数据处理一方面能提高数据的质量,另一方面能让数据更好地适应特定的数据分析工具。数据处理的主要内容包括数据清洗、数据抽取、数据交换和数
据计算等。***
### 2.5.1数据清洗
在数据分析时,海量的原始数据中存在着大量不完整、不一致、有异常的
数据,严重影响到数据分析的结果,所以进行数据清洗就显得尤为重要。
数据清洗是数据价值链中最关键的步骤。垃圾数据,即使是通过最好的分
析,也将产生错误的结果,并误导业务本身。因此在数据分析过程中,数据清
洗占据了很大的工作量。
数据清洗就是处理缺失数据以及清除无意义的信息,如删除原始数据集中
的无关数据、重复数据,平滑噪声数据,筛选掉与分析主题无关的数据,处理
缺失值、异常值等。
#### 1. 重复值的处理
#### 例2-6 去掉重复数据
示例代码如下:
```python
from pandas import DataFrame
from pandas import Series
df = DataFrame({
'age':Series ([26 , 85 , 64 , 85 , 85]) ,
'name': Series ([' Ben ',' John ',' Jerry ',' John ',' John'])
})
df
age | name | |
---|---|---|
0 | 26 | Ben |
1 | 85 | John |
2 | 64 | Jerry |
3 | 85 | John |
4 | 85 | John |
df.duplicated()
0 False
1 False
2 False
3 True
4 False
dtype: bool
df.duplicated('name')
0 False
1 False
2 False
3 True
4 False
dtype: bool
df.drop_duplicates('age')
age | name | |
---|---|---|
0 | 26 | Ben |
1 | 85 | John |
2 | 64 | Jerry |
2. 缺失值处理
从统计上说,缺失的数据可能会产生有偏估计,从而使样本数据不能很 好地代表总体,而现实中绝大部分数据都包含缺失值,因此如何处理缺失值很 重要。
一般说来,缺失值的处理包括两个步骤,即缺失数据的识别和缺失数据的 处理。
- 缺失数据的识别
Pandas 使用浮点值NaN 表示浮点和非浮点数组里的缺失数据,并使 用.isnull 和.notnull 函数来判断缺失情况。
例2-7 缺失数据的识别。
示例代码如下:
from pandas import DataFrame
from pandas import read_excel
df = read_excel('rz.xlsx', sheet_name='Sheet2')
df
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | 2308024241 | 成龙 | 76 | 40.0 | 23.0 | 60 |
1 | 2308024244 | 周怡 | 66 | 47.0 | 47.0 | 44 |
2 | 2308024251 | 张波 | 85 | NaN | 45.0 | 60 |
3 | 2308024249 | 朱浩 | 65 | 72.0 | 62.0 | 71 |
4 | 2308024219 | 封印 | 73 | 61.0 | 47.0 | 46 |
5 | 2308024201 | 迟培 | 60 | 71.0 | 76.0 | 71 |
6 | 2308024347 | 李华 | 67 | 61.0 | 65.0 | 78 |
7 | 2308024307 | 陈田 | 76 | 69.0 | NaN | 69 |
8 | 2308024326 | 余皓 | 66 | 65.0 | 61.0 | 71 |
9 | 2308024219 | 封印 | 73 | 61.0 | 47.0 | 46 |
df.isnull()
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | False | False | False | False | False | False |
1 | False | False | False | False | False | False |
2 | False | False | False | True | False | False |
3 | False | False | False | False | False | False |
4 | False | False | False | False | False | False |
5 | False | False | False | False | False | False |
6 | False | False | False | False | False | False |
7 | False | False | False | False | True | False |
8 | False | False | False | False | False | False |
9 | False | False | False | False | False | False |
df.notnull()
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | True | True | True | True | True | True |
1 | True | True | True | True | True | True |
2 | True | True | True | False | True | True |
3 | True | True | True | True | True | True |
4 | True | True | True | True | True | True |
5 | True | True | True | True | True | True |
6 | True | True | True | True | True | True |
7 | True | True | True | True | False | True |
8 | True | True | True | True | True | True |
9 | True | True | True | True | True | True |
- 缺失数据的处理
对于缺失数据的处理方式有数据补齐、删除对应行、不处理等方法。 ( 1 ) dropna(): 去除数据结构中值为空的数据行。
例2-8 删除数据为空所对应的行。
示例代码如下:
newDF=df.dropna ()
newDF
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | 2308024241 | 成龙 | 76 | 40.0 | 23.0 | 60 |
1 | 2308024244 | 周怡 | 66 | 47.0 | 47.0 | 44 |
3 | 2308024249 | 朱浩 | 65 | 72.0 | 62.0 | 71 |
4 | 2308024219 | 封印 | 73 | 61.0 | 47.0 | 46 |
5 | 2308024201 | 迟培 | 60 | 71.0 | 76.0 | 71 |
6 | 2308024347 | 李华 | 67 | 61.0 | 65.0 | 78 |
8 | 2308024326 | 余皓 | 66 | 65.0 | 61.0 | 71 |
9 | 2308024219 | 封印 | 73 | 61.0 | 47.0 | 46 |
( 2 ) df. fillna(): 用其他数值替代NaN.
有些时候直接删除空数据会影响分析的结果,可以对数据进行填补。
例2-9 使用数值或者任意字符代替缺失值
示例代码如下:
df.fillna('?')
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | 2308024241 | 成龙 | 76 | 40.0 | 23.0 | 60 |
1 | 2308024244 | 周怡 | 66 | 47.0 | 4 |