ipynb等文件下载:https://wwm.lanzouf.com/iklXf023qeef
对数据进行分析首先得对数据进行处理,本章主要介绍Pγthon在数据处理方面的常用方法与技巧,以及Anaconda的安装。毕竟Anaconda 和
Jupγter notebook 已成为款据分析的标准坏境。
本章开始进入Python革之据分析工具的介绍。革之据分析一般都妥周到Numpγ 、Scipγ 和Pandas三个包。Numpγ是Pγthon的主义值计算扩在包,主妥用来处理矩阵,宅的运算效率比到家史高效。Scipy是基于Numpy 的科学计算包,包括线性代狄、统计等工具。Pandas是基于Numpγ的数据分析工具,能方便地操作大型数据集。
Anaconda 是Python 的一个开源发行版本,主要面向科学计算,是一个非常好用且最省心的Python 学习工具。对于学习Pyt hon 的“小白" 来说,安装第三方库就很折腾人,但用了Anaconda 就方便多了,它预装了很多我们用的到或用不到的第三方库,而且相比于Python 用pip install 命令安装库也更方便。Anaconda 中增加了conda install 命令来安装第三方库,方法与pip install 命令一样。当用户熟悉了Anaconda 以后会发现,使用conda install 命令会比使用pip install 命令更方便一些。比如大家经常烦恼的lxml 包的问题, 在Windows 下使用pip install 命令是无法顺利安装的,而使用conda 命令则可以。
代码提示是开发工具必备的功能。当用户需要Spyder 给出代码提示时,只
需要输入函数名的前几个字母,再按下Ta b 键,即可得到IDE 的代码提示。
变量是代码执行过程中暂留在内存中的数据,可以通过Spy der 对变量承载
的数据进行查看,方便用户对数据进行处理。
绘图是进行数据分析必备的技能之一。一款好的工具,必须具备图形绘制
的功能, Spyder 窗体还集成了绘图功能
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]])
Pandas 是Python 的一个数据分析包。最初由AQR Capital Management 于
2008 年4 月开发,并于2009 年年底开源面市。目前由专注于Python 数据包开
发的PyData 开发团队继续开发和维护,属于PyData 项目的一部分。Pandas 最
初是被作为金融数据分析工具而开发出来的,因此, Pandas 为时间序列分析提
供了很好的支持。Pandas 的名称来自于面板数据( Panel Data )和Python 数据
分析( Data Analysis ) 。Panel Data 是经济学中关于多维数据集的一个术语,在
Pandas 中也提供了Panel Data 的数据类型。
Pandas 中除了Panel 数据结构,还引入了两种新的数据结构一- Series 和
DataFrame ,这两种数据结构都建立在NumPy 的基础之上。
( 1 ) Series :一维数组系列,也称序列,与Numpy 中的一维array 类似。
二者与Python 基本的数据结构list 也很相近。
( 2 ) DataFrame :二维的表格型数据结构。可以将DataFrame 理解为Series
的容器。以下的内容主要以DataFrame 为主。
( 3) Panel :三维数组,可以理解为DataFrame 的容器。
Python 常用的3 种数据类型为: Logical 、Numeric 、Character 。
Logical 又叫布尔型,只有两种取值: 0 和1 ,或者真和假( True 和False ) 。
逻辑运算符有:& (与,两个逻辑型数据中,有一个为假,则结果为假〉,
|(或,两个逻辑型数据中,有一个为真,则结果为真) , not (非,取反〉。
运算符 | 注释 | 运算规则 |
---|---|---|
& | 与 | 两个逻辑型数据中,其中一个数据为假, 则结果为假 |
| | 或 | 两个逻辑型数据中,其中一个数据为真, 则结果为真 |
not | 非 | 取相反值,非真的逻辑型数据为假,非假的逻辑型数据为真 |
数值运算符有:+、-、*、/。
宇符型数据一般使用单引号(")或者双引号( “” )包起来。
Python 数据类型变量命名规则如下:
( 1 )变量名可以由a~z 、A~Z、数字、下划线组成, 首字母不能是数字和
下划线;
( 2 )大小写敏感,即区分大小写;
( 3 )变量名不能为Python 中的保留字,如and 、continue 、lambda 、
or 等。
数据结构是指相互之间存在的一种或多种特定关系的数据类型的集合。
Pandas 中主要有Series (系列)和Dataframe (数据框)两种数据结构。
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
数据存在的形式多种多样,有文件( csv、Excel、txt )和数据库CMySQL 、
Access 、SQL Server )等形式。在Pandas 中,常用的载入函数是read_csv,除此
之外还有read excel 和read table 。read table 函数可以读取txt 文件。若是服务
器相关的部署,则还会用到read_sql 函数,直接访问数据库,但它必须配合
MySQL 相关的包。
read table 函数用于导入txt 文件。其命令格式如下:
read table(file, names =[歹u名1 ,列名2, ... J , sep="", ...)
其中:
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... |
csv (Comma-Separated Values )一般称为逗号分隔值,有时也称为字符分隔
因为分隔字符也可以不是逗号,其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含有必须像二进制数字那
样被解读的数据。csv 文件由任意数目的记录组成, 记录间以某种换行符分
隔; 每条记录由字段组成, 字段间的分隔符是其他字符或字符串,最常见的是
逗号或制表符。通常, 所有记录都有完全相同的字段序列。通常都是纯文本文
件。csv 文件格式常见于手机通讯录,可以使用Excel 打开。
read_csv 函数可以导入csv 文件。其命令格式如下:
read_csv(file , names =[列名1 ,列名2, .. ] , sep="",… )
其中:
示例代码如下:
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 |
read_excel 函数可以导入Excel 文件。其命令格式如下:
read_excel (file,sheetname,header=0)
其中:
实例代码如下:
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 |
Python 中操作MySQL 的模块是PyMy SQL,在导入MySQL 数据之前, 需
要安装PyMySQL 模块。目前Py由on3.x 仅支持PyMySQL ,不支持MySQLdb 。
安装PyMySQL ,命令为pip install pymysql
read_sql 函数可以导入My SQL 库。其命令格式如下:
read_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
一段代码,我懒得写了
方法二:
一段代码,懒得写了
to_csv 函数可以导出 csv 文件。其命令格式如下:
to_csv (file path,sep=",", index=TRUE, header=TRUE)
其中:
示例代码如下:
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 |
to_excel 函数可以导出 Excel 文件。其命令格式如下:
to excel(file_path ,index=TRUE ,header=TRUE)
其中:
示例代码如下:
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
to_sql 函数可以将文件写入到MySQL数据库。其命令格式如下:
to_sql(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 |
从统计上说,缺失的数据可能会产生有偏估计,从而使样本数据不能很
好地代表总体,而现实中绝大部分数据都包含缺失值,因此如何处理缺失值很
重要。
一般说来,缺失值的处理包括两个步骤,即缺失数据的识别和缺失数据的
处理。
Pandas 使用浮点值NaN 表示浮点和非浮点数组里的缺失数据,并使
用.isnull 和.notnull 函数来判断缺失情况。
示例代码如下:
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(): 去除数据结构中值为空的数据行。
示例代码如下:
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.
有些时候直接删除空数据会影响分析的结果,可以对数据进行填补。
示例代码如下:
df.fillna('?')
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | 2308024241 | 成龙 | 76 | 40.0 | 23.0 | 60 |
1 | 2308024244 | 周怡 | 66 | 47.0 | 47.0 | 44 |
2 | 2308024251 | 张波 | 85 | ? | 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 | ? | 69 |
8 | 2308024326 | 余皓 | 66 | 65.0 | 61.0 | 71 |
9 | 2308024219 | 封印 | 73 | 61.0 | 47.0 | 46 |
(3)df.fillna(method='pad):用前一个数据值替代NaN。
示例代码如下:
df . fillna(method='pad')
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | 2308024241 | 成龙 | 76 | 40.0 | 23.0 | 60 |
1 | 2308024244 | 周怡 | 66 | 47.0 | 47.0 | 44 |
2 | 2308024251 | 张波 | 85 | 47.0 | 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 | 65.0 | 69 |
8 | 2308024326 | 余皓 | 66 | 65.0 | 61.0 | 71 |
9 | 2308024219 | 封印 | 73 | 61.0 | 47.0 | 46 |
(4) df.fillna(method=‘bfill’):用后一个数据值替代NaN.
示例代码如下:
df.fillna(method='bfill')
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | 2308024241 | 成龙 | 76 | 40.0 | 23.0 | 60 |
1 | 2308024244 | 周怡 | 66 | 47.0 | 47.0 | 44 |
2 | 2308024251 | 张波 | 85 | 72.0 | 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 | 61.0 | 69 |
8 | 2308024326 | 余皓 | 66 | 65.0 | 61.0 | 71 |
9 | 2308024219 | 封印 | 73 | 61.0 | 47.0 | 46 |
( 5 ) df. fillna( df.mean()):用平均数或者其他描述性统计量来代替NaN。
示例代码如下:
df.fillna(df.mean())
C:\Users\b2014\AppData\Local\Temp\ipykernel_4956\634187881.py:1: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError. Select only valid columns before calling the reduction.
df.fillna(df.mean())
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | 2308024241 | 成龙 | 76 | 40.000000 | 23.000000 | 60 |
1 | 2308024244 | 周怡 | 66 | 47.000000 | 47.000000 | 44 |
2 | 2308024251 | 张波 | 85 | 60.777778 | 45.000000 | 60 |
3 | 2308024249 | 朱浩 | 65 | 72.000000 | 62.000000 | 71 |
4 | 2308024219 | 封印 | 73 | 61.000000 | 47.000000 | 46 |
5 | 2308024201 | 迟培 | 60 | 71.000000 | 76.000000 | 71 |
6 | 2308024347 | 李华 | 67 | 61.000000 | 65.000000 | 78 |
7 | 2308024307 | 陈田 | 76 | 69.000000 | 52.555556 | 69 |
8 | 2308024326 | 余皓 | 66 | 65.000000 | 61.000000 | 71 |
9 | 2308024219 | 封印 | 73 | 61.000000 | 47.000000 | 46 |
“数分"列中有一个空值,该列除空值外的9 个数的均值为60.7777777 8’
故以60.777778 替代空值, “高代"列也一样。
( 6 ) df.fillna( df.mean()[‘填补列名气’计算均值的列名’]]):
的均值进行缺失值的处理。
示例代码如下:
df.fillna(df.mean()['高代':'解几'])
C:\Users\b2014\AppData\Local\Temp\ipykernel_4956\1656679278.py:1: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError. Select only valid columns before calling the reduction.
df.fillna(df.mean()['高代':'解几'])
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | 2308024241 | 成龙 | 76 | 40.0 | 23.000000 | 60 |
1 | 2308024244 | 周怡 | 66 | 47.0 | 47.000000 | 44 |
2 | 2308024251 | 张波 | 85 | NaN | 45.000000 | 60 |
3 | 2308024249 | 朱浩 | 65 | 72.0 | 62.000000 | 71 |
4 | 2308024219 | 封印 | 73 | 61.0 | 47.000000 | 46 |
5 | 2308024201 | 迟培 | 60 | 71.0 | 76.000000 | 71 |
6 | 2308024347 | 李华 | 67 | 61.0 | 65.000000 | 78 |
7 | 2308024307 | 陈田 | 76 | 69.0 | 52.555556 | 69 |
8 | 2308024326 | 余皓 | 66 | 65.0 | 61.000000 | 71 |
9 | 2308024219 | 封印 | 73 | 61.0 | 47.000000 | 46 |
用“解几"列的平均值来填补“高代"列的空缺值。
( 7 ) df.fillna( {'列名I ‘:值1, I 列名2’ :{直2 }) : 可以传入一个字典,对不同的
列填充不同的值。
示例代码如下:
df.fillna({'数分':100,'高代':0})
学号 | 姓名 | 英语 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|
0 | 2308024241 | 成龙 | 76 | 40.0 | 23.0 | 60 |
1 | 2308024244 | 周怡 | 66 | 47.0 | 47.0 | 44 |
2 | 2308024251 | 张波 | 85 | 100.0 | 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 | 0.0 | 69 |
8 | 2308024326 | 余皓 | 66 | 65.0 | 61.0 | 71 |
9 | 2308024219 | 封印 | 73 | 61.0 | 47.0 | 46 |
“数分"列填充值为100, “高代"列填充值为0 。
( 8) strip ():清除字符型数据左右(首尾)指定的字符,
间的不清除。
示例代码如下:
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['name'].str.strip()
0 Ben
1 John
2 Jerry
3 John
4 John
Name: name, dtype: object
字段抽取是指抽出某列上指定位置的数据做成新的列。其命令格式如下:
slice(start, stop)
其中:
from pandas import DataFrame
from pandas import read_excel
df = read_excel ('i_nuc.xls', sheet_name= 'Sheet4')
df.head() #展示数据袤的前5 行,如显示后5 行,则为df.tail()
学号 | 电话 | IP | |
---|---|---|---|
0 | 2308024241 | 1.892225e+10 | 221.205.98.55 |
1 | 2308024244 | 1.352226e+10 | 183.184.226.205 |
2 | 2308024251 | 1.342226e+10 | 221.205.98.55 |
3 | 2308024249 | 1.882226e+10 | 222.31.51.200 |
4 | 2308024219 | 1.892225e+10 | 120.207.64.3 |
df [ '电话' ]=df ['电话' ]. astype (str) #astype ()转化类型
df [ '电话' ]
0 18922254812.0
1 13522255003.0
2 13422259938.0
3 18822256753.0
4 18922253721.0
5 nan
6 13822254373.0
7 13322252452.0
8 18922257681.0
9 13322252452.0
10 18922257681.0
11 19934210999.0
12 19934210911.0
13 19934210912.0
14 19934210913.0
15 19934210914.0
16 19934210915.0
17 19934210916.0
18 19934210917.0
19 19934210918.0
Name: 电话, dtype: object
bands =df['电话'].str.slice(0,3)#抽取手机号码的前三位,便于判断号码的品牌
bands
0 189
1 135
2 134
3 188
4 189
5 nan
6 138
7 133
8 189
9 133
10 189
11 199
12 199
13 199
14 199
15 199
16 199
17 199
18 199
19 199
Name: 电话, dtype: object
areas= df ['电话'].str.slice (3,7)#抽取手机号码的中间四位,以判断号码的地
areas
0 2225
1 2225
2 2225
3 2225
4 2225
5
6 2225
7 2225
8 2225
9 2225
10 2225
11 3421
12 3421
13 3421
14 3421
15 3421
16 3421
17 3421
18 3421
19 3421
Name: 电话, dtype: object
tell= df['电话'].str.slice(7,11)#抽取手机号码的后四位
tell
0 4812
1 5003
2 9938
3 6753
4 3721
5
6 4373
7 2452
8 7681
9 2452
10 7681
11 0999
12 0911
13 0912
14 0913
15 0914
16 0915
17 0916
18 0917
19 0918
Name: 电话, dtype: object
宇段拆分是指按指定的字符sep , 拆分己有的字符串。其命令格式如下:
split (sep, n , expand=False)
参数说明:
* sep 表示用于分隔字符串的分隔符:
* n 表示分割后新增的列数;
& expand 表示是否展开为数据框,默认为FALSE
返回值: expand 为TRUE ,返回DaraFrame ; expand 为False ,返回Series
#### 【例2-17】拆分字符串为指定的列数。
示例代码如下:
```python
from pandas import DataFrame
from pandas import read_excel
df= read_excel(r'i_nuc.xls', sheet_name='Sheet4')
df
学号 | 电话 | IP | |
---|---|---|---|
0 | 2308024241 | 1.892225e+10 | 221.205.98.55 |
1 | 2308024244 | 1.352226e+10 | 183.184.226.205 |
2 | 2308024251 | 1.342226e+10 | 221.205.98.55 |
3 | 2308024249 | 1.882226e+10 | 222.31.51.200 |
4 | 2308024219 | 1.892225e+10 | 120.207.64.3 |
5 | 2308024201 | NaN | 222.31.51.200 |
6 | 2308024347 | 1.382225e+10 | 222.31.59.220 |
7 | 2308024307 | 1.332225e+10 | 221.205.98.55 |
8 | 2308024326 | 1.892226e+10 | 183.184.230.38 |
9 | 2308024320 | 1.332225e+10 | 221.205.98.55 |
10 | 2308024342 | 1.892226e+10 | 183.184.230.38 |
11 | 2308024310 | 1.993421e+10 | 183.184.230.39 |
12 | 2308024435 | 1.993421e+10 | 185.184.230.40 |
13 | 2308024432 | 1.993421e+10 | 183.154.230.41 |
14 | 2308024446 | 1.993421e+10 | 183.184.231.42 |
15 | 2308024421 | 1.993421e+10 | 183.154.230.43 |
16 | 2308024433 | 1.993421e+10 | 173.184.230.44 |
17 | 2308024428 | 1.993421e+10 | NaN |
18 | 2308024402 | 1.993421e+10 | 183.184.230.4 |
19 | 2308024422 | 1.993421e+10 | 153.144.230.7 |
df['IP'].str.strip ()#IP先转为str,再删除首尾空格
0 221.205.98.55
1 183.184.226.205
2 221.205.98.55
3 222.31.51.200
4 120.207.64.3
5 222.31.51.200
6 222.31.59.220
7 221.205.98.55
8 183.184.230.38
9 221.205.98.55
10 183.184.230.38
11 183.184.230.39
12 185.184.230.40
13 183.154.230.41
14 183.184.231.42
15 183.154.230.43
16 173.184.230.44
17 NaN
18 183.184.230.4
19 153.144.230.7
Name: IP, dtype: object
newDF=df ['IP'].str.split ('.',1,True)#按第一个"."分成两列,1表示新增的列数
newDF
0 | 1 | |
---|---|---|
0 | 221 | 205.98.55 |
1 | 183 | 184.226.205 |
2 | 221 | 205.98.55 |
3 | 222 | 31.51.200 |
4 | 120 | 207.64.3 |
5 | 222 | 31.51.200 |
6 | 222 | 31.59.220 |
7 | 221 | 205.98.55 |
8 | 183 | 184.230.38 |
9 | 221 | 205.98.55 |
10 | 183 | 184.230.38 |
11 | 183 | 184.230.39 |
12 | 185 | 184.230.40 |
13 | 183 | 154.230.41 |
14 | 183 | 184.231.42 |
15 | 183 | 154.230.43 |
16 | 173 | 184.230.44 |
17 | NaN | NaN |
18 | 183 | 184.230.4 |
19 | 153 | 144.230.7 |
newDF.columns=['IP1','IP2-4']#给第1列、第2列增加列名称
newDF
IP1 | IP2-4 | |
---|---|---|
0 | 221 | 205.98.55 |
1 | 183 | 184.226.205 |
2 | 221 | 205.98.55 |
3 | 222 | 31.51.200 |
4 | 120 | 207.64.3 |
5 | 222 | 31.51.200 |
6 | 222 | 31.59.220 |
7 | 221 | 205.98.55 |
8 | 183 | 184.230.38 |
9 | 221 | 205.98.55 |
10 | 183 | 184.230.38 |
11 | 183 | 184.230.39 |
12 | 185 | 184.230.40 |
13 | 183 | 154.230.41 |
14 | 183 | 184.231.42 |
15 | 183 | 154.230.43 |
16 | 173 | 184.230.44 |
17 | NaN | NaN |
18 | 183 | 184.230.4 |
19 | 153 | 144.230.7 |
重置索引是指指定某列为索引,以便于对其他数据进行操作。其命令格式如下:
df.set _index ('列名')
示例代码如下:
from pandas import DataFrame
from pandas import Series
df = DataFrame (
{'age' :Series ( [26 , 85 , 64, 85, 85]),
'name':Series(['Ben','John','Jerry','John','John'])}
)
df1=df.set_index('name') #以name列为新的索引
df1
age | |
---|---|
name | |
Ben | 26 |
John | 85 |
Jerry | 64 |
John | 85 |
John | 85 |
记录抽取是指根据一定的条件,对数据进行抽取 其命令格式如下:
df[condition]
参数说明:
condition 表示过滤条件。
返回值: DataFrame
常用的 condition 类型有:
示例代码如下:
import pandas
from pandas import read_excel
df =read_excel(r'i_nuc.xls', sheet_name='Sheet4')
df.head()
学号 | 电话 | IP | |
---|---|---|---|
0 | 2308024241 | 1.892225e+10 | 221.205.98.55 |
1 | 2308024244 | 1.352226e+10 | 183.184.226.205 |
2 | 2308024251 | 1.342226e+10 | 221.205.98.55 |
3 | 2308024249 | 1.882226e+10 | 222.31.51.200 |
4 | 2308024219 | 1.892225e+10 | 120.207.64.3 |
df[df.电话==13322252452]
学号 | 电话 | IP | |
---|---|---|---|
7 | 2308024307 | 1.332225e+10 | 221.205.98.55 |
9 | 2308024320 | 1.332225e+10 | 221.205.98.55 |
df[df.电话>13322252452]
学号 | 电话 | IP | |
---|---|---|---|
0 | 2308024241 | 1.892225e+10 | 221.205.98.55 |
1 | 2308024244 | 1.352226e+10 | 183.184.226.205 |
2 | 2308024251 | 1.342226e+10 | 221.205.98.55 |
3 | 2308024249 | 1.882226e+10 | 222.31.51.200 |
4 | 2308024219 | 1.892225e+10 | 120.207.64.3 |
6 | 2308024347 | 1.382225e+10 | 222.31.59.220 |
8 | 2308024326 | 1.892226e+10 | 183.184.230.38 |
10 | 2308024342 | 1.892226e+10 | 183.184.230.38 |
11 | 2308024310 | 1.993421e+10 | 183.184.230.39 |
12 | 2308024435 | 1.993421e+10 | 185.184.230.40 |
13 | 2308024432 | 1.993421e+10 | 183.154.230.41 |
14 | 2308024446 | 1.993421e+10 | 183.184.231.42 |
15 | 2308024421 | 1.993421e+10 | 183.154.230.43 |
16 | 2308024433 | 1.993421e+10 | 173.184.230.44 |
17 | 2308024428 | 1.993421e+10 | NaN |
18 | 2308024402 | 1.993421e+10 | 183.184.230.4 |
19 | 2308024422 | 1.993421e+10 | 153.144.230.7 |
df[df.电话.between(13400000000,13999999999)]
学号 | 电话 | IP | |
---|---|---|---|
1 | 2308024244 | 1.352226e+10 | 183.184.226.205 |
2 | 2308024251 | 1.342226e+10 | 221.205.98.55 |
6 | 2308024347 | 1.382225e+10 | 222.31.59.220 |
df [df.IP.isnull ()]
学号 | 电话 | IP | |
---|---|---|---|
17 | 2308024428 | 1.993421e+10 | NaN |
df [df.IP.str.contains ('222.',na=False) ]
学号 | 电话 | IP | |
---|---|---|---|
3 | 2308024249 | 1.882226e+10 | 222.31.51.200 |
5 | 2308024201 | NaN | 222.31.51.200 |
6 | 2308024347 | 1.382225e+10 | 222.31.59.220 |
随机抽样是指随机从数据中按照一定的行数或者比例抽取数据。
随机抽样函数格式如下:
numpy. random.randint (start, end, num)
参数说明:
示例代码如下:
from pandas import read_excel
df= read_excel(r'i_nuc.xls' ,sheet_name='Sheet4')
df.head()
学号 | 电话 | IP | |
---|---|---|---|
0 | 2308024241 | 1.892225e+10 | 221.205.98.55 |
1 | 2308024244 | 1.352226e+10 | 183.184.226.205 |
2 | 2308024251 | 1.342226e+10 | 221.205.98.55 |
3 | 2308024249 | 1.882226e+10 | 222.31.51.200 |
4 | 2308024219 | 1.892225e+10 | 120.207.64.3 |
df[df.电话>=18822256753]#单个逻辑条件
学号 | 电话 | IP | |
---|---|---|---|
0 | 2308024241 | 1.892225e+10 | 221.205.98.55 |
3 | 2308024249 | 1.882226e+10 | 222.31.51.200 |
4 | 2308024219 | 1.892225e+10 | 120.207.64.3 |
8 | 2308024326 | 1.892226e+10 | 183.184.230.38 |
10 | 2308024342 | 1.892226e+10 | 183.184.230.38 |
11 | 2308024310 | 1.993421e+10 | 183.184.230.39 |
12 | 2308024435 | 1.993421e+10 | 185.184.230.40 |
13 | 2308024432 | 1.993421e+10 | 183.154.230.41 |
14 | 2308024446 | 1.993421e+10 | 183.184.231.42 |
15 | 2308024421 | 1.993421e+10 | 183.154.230.43 |
16 | 2308024433 | 1.993421e+10 | 173.184.230.44 |
17 | 2308024428 | 1.993421e+10 | NaN |
18 | 2308024402 | 1.993421e+10 | 183.184.230.4 |
19 | 2308024422 | 1.993421e+10 | 153.144.230.7 |
df [(df.电话>=13422259938 )&(df.电话<13822254373)]
学号 | 电话 | IP | |
---|---|---|---|
1 | 2308024244 | 1.352226e+10 | 183.184.226.205 |
2 | 2308024251 | 1.342226e+10 | 221.205.98.55 |
这种方式获取的数据切片都是 DataFrame
示例代码如下:
from pandas import read_excel
df= read_excel(r'i_nuc.xls',sheet_name='Sheet4')
df.head()
学号 | 电话 | IP | |
---|---|---|---|
0 | 2308024241 | 1.892225e+10 | 221.205.98.55 |
1 | 2308024244 | 1.352226e+10 | 183.184.226.205 |
2 | 2308024251 | 1.342226e+10 | 221.205.98.55 |
3 | 2308024249 | 1.882226e+10 | 222.31.51.200 |
4 | 2308024219 | 1.892225e+10 | 120.207.64.3 |
r= np.random.randint(0,10 , 3)
r
array([2, 8, 3])
df.loc[r, :] #抽取 行数据,也可以直接写成 df.loc[r)
学号 | 电话 | IP | |
---|---|---|---|
2 | 2308024251 | 1.342226e+10 | 221.205.98.55 |
8 | 2308024326 | 1.892226e+10 | 183.184.230.38 |
3 | 2308024249 | 1.882226e+10 | 222.31.51.200 |
( 1 )使用索引名(标签)选取数据: f. oc 行标签,列标签
示例代码如下:
df=df. set_index ('学号')#更改“学号”列为新的索引
df . head()
电话 | IP | |
---|---|---|
学号 | ||
2308024241 | 1.892225e+10 | 221.205.98.55 |
2308024244 | 1.352226e+10 | 183.184.226.205 |
2308024251 | 1.342226e+10 | 221.205.98.55 |
2308024249 | 1.882226e+10 | 222.31.51.200 |
2308024219 | 1.892225e+10 | 120.207.64.3 |
df.loc[2308024241:2308024201]#选取a到b行的数据:df . loc [’ a ’:’ b ’ ]
电话 | IP | |
---|---|---|
学号 | ||
2308024241 | 1.892225e+10 | 221.205.98.55 |
2308024244 | 1.352226e+10 | 183.184.226.205 |
2308024251 | 1.342226e+10 | 221.205.98.55 |
2308024249 | 1.882226e+10 | 222.31.51.200 |
2308024219 | 1.892225e+10 | 120.207.64.3 |
2308024201 | NaN | 222.31.51.200 |
df.loc[:,'电话'].head()#选取“电话”列的数据
学号
2308024241 1.892225e+10
2308024244 1.352226e+10
2308024251 1.342226e+10
2308024249 1.882226e+10
2308024219 1.892225e+10
Name: 电话, dtype: float64
df.loc的第一个参数是行标签,第二个参数为列标签(可选参数,默认为所有列标签),两个参数既可以是列表也可以是单个字符,如果两个参数都为列表则返回的是DataFrame,否则为Series。
import pandas as pd
df=pd.DataFrame({'a':[1,2,3],'b':['a','b','c'],'c':["A","B","C"]})
df
a | b | c | |
---|---|---|---|
0 | 1 | a | A |
1 | 2 | b | B |
2 | 3 | c | C |
df.loc[1] #抽取index=l的行,但返回的是Series, 而不是DaTa Frame
a 2
b b
c B
Name: 1, dtype: object
df.loc[[1,2]]#抽取index=1和2的两行
a | b | c | |
---|---|---|---|
1 | 2 | b | B |
2 | 3 | c | C |
(2)使用索引号选取数据: df. iloc [行索引号,列索引号]
示例代码如下:
from pandas import read_excel
df = read_excel (r'i_nuc.xls', sheet_name= 'Sheet4')
df=df.set_index ('学号')
df.head ()
电话 | IP | |
---|---|---|
学号 | ||
2308024241 | 1.892225e+10 | 221.205.98.55 |
2308024244 | 1.352226e+10 | 183.184.226.205 |
2308024251 | 1.342226e+10 | 221.205.98.55 |
2308024249 | 1.882226e+10 | 222.31.51.200 |
2308024219 | 1.892225e+10 | 120.207.64.3 |
df.iloc [1,0]#选取第2行、第1列的值,返回的为单个值
13522255003.0
df.iloc[[0,2],:]#选取第1行和第3行的数据
电话 | IP | |
---|---|---|
学号 | ||
2308024241 | 1.892225e+10 | 221.205.98.55 |
2308024251 | 1.342226e+10 | 221.205.98.55 |
df.iloc[0:2,:]#选取第1行到第3行(不包含第3行)的数据
电话 | IP | |
---|---|---|
学号 | ||
2308024241 | 1.892225e+10 | 221.205.98.55 |
2308024244 | 1.352226e+10 | 183.184.226.205 |
df.iloc [:,1]#选取所有记录的第2列的值,返回的为一个Series
学号
2308024241 221.205.98.55
2308024244 183.184.226.205
2308024251 221.205.98.55
2308024249 222.31.51.200
2308024219 120.207.64.3
2308024201 222.31.51.200
2308024347 222.31.59.220
2308024307 221.205.98.55
2308024326 183.184.230.38
2308024320 221.205.98.55
2308024342 183.184.230.38
2308024310 183.184.230.39
2308024435 185.184.230.40
2308024432 183.154.230.41
2308024446 183.184.231.42
2308024421 183.154.230.43
2308024433 173.184.230.44
2308024428 NaN
2308024402 183.184.230.4
2308024422 153.144.230.7
Name: IP, dtype: object
df.iloc[1,:]#选取第2行数据,返回的为一个Series
电话 13522255003.0
IP 183.184.226.205
Name: 2308024244, dtype: object
示例代码如下:
import pandas as pd
index_loc = ['a', 'b']
index_iloc = [1,2]
data = [[1,2,3,4], [5, 6,7, 8]]
columns = ['one','two','three','four']
df1 = pd.DataFrame(data=data, index=index_loc,columns=columns)
df2 = pd.DataFrame(data=data, index=index_iloc,columns=columns)
df1.loc['a']#按索引名提取
one 1
two 2
three 3
four 4
Name: a, dtype: int64
df1.iloc[0]#按索号提取
one 1
two 2
three 3
four 4
Name: a, dtype: int64
df2.iloc[0]#按索引号提取,会报错,因索引名是int
one 1
two 2
three 3
four 4
Name: 1, dtype: int64
字典数据抽取是指将字典数据抽取为 dataframe ,有以下三种方法。
(1)字典的key和value各作为一列
示例代码如下:
import pandas
from pandas import DataFrame
d1={'a':'[1,2,3]','b':'[0,1,2]'}
a1=pandas.DataFrame.from_dict(d1,orient='index') #将字典转为dataframe,且key列做成了index
a1.index.name ='key'#将index的列名改成key'
b1=a1.reset_index() #重新增加index,并将原index 做成了'key'列 b1.columns=['key','value'] #对列重新命名为'key'和value'
b1
key | 0 | |
---|---|---|
0 | a | [1,2,3] |
1 | b | [0,1,2] |
(2)字典里的每一个元素作为一列(同长)
示例代码如下:
d2={'a':[1,2,3],'b':[4,5,6]} #字典的value必须长度相等
a2=DataFrame (d2)
a2
a | b | |
---|---|---|
0 | 1 | 4 |
1 | 2 | 5 |
2 | 3 | 6 |
(3)字典里的每一个元素作为一列(不同长)
示例代码如下:
d={'one':pandas.Series([1,2,3]),'two':pandas.Series ([1,2,3,4])} #字典的value长度可以不相等
df= pandas.DataFrame(d)
df
one | two | |
---|---|---|
0 | 1.0 | 1 |
1 | 2.0 | 2 |
2 | 3.0 | 3 |
3 | NaN | 4 |
Pandas里并没有直接指定索引的插入行的方法,所以要用户自行设置。
示例代码如下:
import pandas as pd
df=pd.DataFrame({'a':[1,2,3],'b':['a','b','c'],'c':["A","B","C"]})
df
a | b | c | |
---|---|---|---|
0 | 1 | a | A |
1 | 2 | b | B |
2 | 3 | c | C |
line= pd.DataFrame({df.columns[0]:"--",df.columns[1]:"--",df.columns[2]:"--"},index=[1])#抽取df的index=1的行,并将此行第一列 columns[0]赋值"--",第二、三列同样赋值"--"
line
a | b | c | |
---|---|---|---|
1 | -- | -- | -- |
df0= pd.concat([df. loc[:0], line, df. loc[1:11]])
df0
a | b | c | |
---|---|---|---|
0 | 1 | a | A |
1 | -- | -- | -- |
1 | 2 | b | B |
2 | 3 | c | C |
这里df.loc[:0]不能写成df.loc[0],因为df.loc[0]表示抽取index=0的行,返回的是Series不是DataFrame。
dfo的索引没有重新给出新的索引,需要对索引进行重新设定。
方法一:
先利用reset_index()函数给出新的索引,但是原索引将作为新增加的index 列,再对新增加的列利用drop函数,删除新增的index列。
示例代码如下:
此方法虽然有点繁琐笨拙,但是有时候确实有输出原索引的需求。
示例代码如下:
df1=df0.reset_index()#重新给出索引,后面详细解释
df1
index | a | b | c | |
---|---|---|---|---|
0 | 0 | 1 | a | A |
1 | 1 | -- | -- | -- |
2 | 1 | 2 | b | B |
3 | 2 | 3 | c | C |
df2=df1.drop('index', axis=1)#删除index列
df2
a | b | c | |
---|---|---|---|
0 | 1 | a | A |
1 | -- | -- | -- |
2 | 2 | b | B |
3 | 3 | c | C |
方法二:
直接对reset_index()函数添加drop=True参数,即删除了原索引并给出新的索引。
示例代码如下:
df2=pd.concat([df.loc[:0],line,df.loc[1:]]).reset_index (drop=True)
df2
a | b | c | |
---|---|---|---|
0 | 1 | a | A |
1 | -- | -- | -- |
2 | 2 | b | B |
3 | 3 | c | C |
方法三:
先找出df0的索引长度:lenth=len(dfo.index),再利用整数序列函数生成索引:range(lenth),然后把生成的索引赋值给dfo.index。
示例代码如下:
df0.index=range (len (df0.index))
df0
a | b | c | |
---|---|---|---|
0 | 1 | a | A |
1 | -- | -- | -- |
2 | 2 | b | B |
3 | 3 | c | C |
修改记录(数据)是常有的事情,比如数据中有些需要整体替换,有些需要个别修改等情况经常会出现。
整列、整行的替换这里不多说,很容易做到。例如执行语句: df['平时成绩]=score_2,该语句中score_2是将被填进去的数据列(可以是列表或者Series)
这里要说的是整个df(数据框) 中可能各列都有NaN, 现在需要把NaN替换成0以便于计算, 类似于Word软件中“查找替换”(Ctrl+H) 功能。
示例代码如下:
from pandas import read_excel
df=pd.read_excel(r'i_nuc.xls',sheet_name='Sheet3')
df.head()
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
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 |
(1)单值替换
其命令格式如下:
df.replace('B','A')#用A替换B,也可以用df.replace ({'B':'A')命令实现
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
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 |
(2)指定列单值替换
df.replace ({'体育' :'作弊'},0)#用0替换“体育”列中“作弊”
df.replace ({'体育':'作弊','军训':'缺考'},0) #用0替换“体育”列中“作弊”以及“军训”列中的“缺考”
下面用具体的例子说明,例如:
df.replace ({'体育' :'作弊'},0)#用0替换“体育”列中“作弊”
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
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 | 0 | 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)多值替换
多值替换可用如下命令:
df.replace(['成龙','周怡'],['陈龙','周毅'])#用“陈龙”替换“成龙”,用“周毅”替换“周怡”
还可以用下面两种命令方式,效果一样:
df.replace({'成龙':'陈龙','周怡':'周毅'})
df.replace({'成龙','周怡'},{'陈龙','周毅'})
示例代码如下:
df.replace({'成龙':'陈龙','周怡':'周毅'})
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
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 |
可以直接使用df.reindex方法交换数据中的两行或两列,读者可以自己DY。reindex函数后面将详细讲解。
示例代码如下:
import pandas as pd
df=pd.DataFrame({'a':[1,2,3],'b':['a','b','c'],'c':["A","B","C"]})
df
a | b | c | |
---|---|---|---|
0 | 1 | a | A |
1 | 2 | b | B |
2 | 3 | c | C |
hang= [0,2,1]
df.reindex (hang)
a | b | c | |
---|---|---|---|
0 | 1 | a | A |
2 | 3 | c | C |
1 | 2 | b | B |
lie=['a','c','b']
df.reindex(columns=lie)
a | c | b | |
---|---|---|---|
0 | 1 | A | a |
1 | 2 | B | b |
2 | 3 | C | c |
Series的sort index(ascending-True) 方法可以对index进行排序操作,ascending参数用于控制升序(ascending=True) 或降序(ascending-False) , 默认为升序。
示例代码如下:
from pandas import DataFrame
df0={'Ohio':[0, 6, 3] , 'Texas':[7, 4, 1] , 'California':[2, 8, 5] }
df=DataFrame(df0, index=['a', 'd', 'c'])
df
Ohio | Texas | California | |
---|---|---|---|
a | 0 | 7 | 2 |
d | 6 | 4 | 8 |
c | 3 | 1 | 5 |
df.sort_index()#默认按index升序排序,降序:df.sort index(ascending=False)
Ohio | Texas | California | |
---|---|---|---|
a | 0 | 7 | 2 |
c | 3 | 1 | 5 |
d | 6 | 4 | 8 |
df.sort_index('by'=='Ohio')#按Ohio列升序排序,也可以是多列by=['Ohio', 'Texas']
C:\Users\b2014\AppData\Local\Temp\ipykernel_4956\45844033.py:1: FutureWarning: In a future version of pandas all arguments of DataFrame.sort_index will be keyword-only.
df.sort_index('by'=='Ohio')#按Ohio列升序排序,也可以是多列by=['Ohio', 'Texas']
Ohio | Texas | California | |
---|---|---|---|
a | 0 | 7 | 2 |
c | 3 | 1 | 5 |
d | 6 | 4 | 8 |
df.sort_index('by'==['California','Texas'])
C:\Users\b2014\AppData\Local\Temp\ipykernel_4956\3360228840.py:1: FutureWarning: In a future version of pandas all arguments of DataFrame.sort_index will be keyword-only.
df.sort_index('by'==['California','Texas'])
Ohio | Texas | California | |
---|---|---|---|
a | 0 | 7 | 2 |
c | 3 | 1 | 5 |
d | 6 | 4 | 8 |
df.sort_index(axis=1)
California | Ohio | Texas | |
---|---|---|---|
a | 2 | 0 | 7 |
d | 8 | 6 | 4 |
c | 5 | 3 | 1 |
排名方法(Series.rank(method=-‘average’,ascending-True)与排序的不同之处在于,它会把对象的values替换成名次(从1到n),对于平级项可以通过该方法里的method参数来处理,method参数有四个可选项:average、min、max、first。举例如下:
from pandas import Series
ser=Series ([3,2,0,3], index=list ('abcd'))
ser
a 3
b 2
c 0
d 3
dtype: int64
ser.rank()
a 3.5
b 2.0
c 1.0
d 3.5
dtype: float64
ser.rank()
a 3.5
b 2.0
c 1.0
d 3.5
dtype: float64
ser.rank(method='min')
a 3.0
b 2.0
c 1.0
d 3.0
dtype: float64
ser.rank(method='max')
a 4.0
b 2.0
c 1.0
d 4.0
dtype: float64
ser.rank(method='first')
a 3.0
b 2.0
c 1.0
d 4.0
dtype: float64
Series对象的重新索引通过其reindext(index-=None,kwargs)方法实现kwargs中常用的参数有两个:method-=None和fill value=np.NaN。
示例代码如下:
import pandas as pd
df=pd.DataFrame({'a':[1,2,3,0],'c':["A","E","B","c"],'d':['a','b','d','c'],'b':[1,3,2,5],},index=[1,3,2,4])
df
a | c | d | b | |
---|---|---|---|---|
1 | 1 | A | a | 1 |
3 | 2 | E | b | 3 |
2 | 3 | B | d | 2 |
4 | 0 | c | c | 5 |
df.sort_index()
a | c | d | b | |
---|---|---|---|---|
1 | 1 | A | a | 1 |
2 | 3 | B | d | 2 |
3 | 2 | E | b | 3 |
4 | 0 | c | c | 5 |
df.sort_index(axis=1)#队列进行排序,降序添加ascending=False
a | b | c | d | |
---|---|---|---|---|
1 | 1 | 1 | A | a |
3 | 2 | 3 | E | b |
2 | 3 | 2 | B | d |
4 | 0 | 5 | c | c |
df.sort_index('by'=='a')#对a列进行排序,by仅用于列main:1:FutureWarning:by argument to sort index is deprecated,pls use.sort values(by=...)
C:\Users\b2014\AppData\Local\Temp\ipykernel_4956\2549661233.py:1: FutureWarning: In a future version of pandas all arguments of DataFrame.sort_index will be keyword-only.
df.sort_index('by'=='a')#对a列进行排序,by仅用于列main:1:FutureWarning:by argument to sort index is deprecated,pls use.sort values(by=...)
a | c | d | b | |
---|---|---|---|---|
1 | 1 | A | a | 1 |
2 | 3 | B | d | 2 |
3 | 2 | E | b | 3 |
4 | 0 | c | c | 5 |
df.sort_index('by'==['a','b'])#对a、b两列依次排序main:1:FutureWarning:by argument to sort_index is deprecated,pls use.sort values(by=..…)
C:\Users\b2014\AppData\Local\Temp\ipykernel_4956\2730870432.py:1: FutureWarning: In a future version of pandas all arguments of DataFrame.sort_index will be keyword-only.
df.sort_index('by'==['a','b'])#对a、b两列依次排序main:1:FutureWarning:by argument to sort_index is deprecated,pls use.sort values(by=..…)
a | c | d | b | |
---|---|---|---|---|
1 | 1 | A | a | 1 |
2 | 3 | B | d | 2 |
3 | 2 | E | b | 3 |
4 | 0 | c | c | 5 |
df.sort_index(by='a)对列进行排序时也可以使用dfsort_values’a)。
df.sort_values(['a','b'])
a | c | d | b | |
---|---|---|---|---|
4 | 0 | c | c | 5 |
1 | 1 | A | a | 1 |
3 | 2 | E | b | 3 |
2 | 3 | B | d | 2 |
示例代码如下:
from pandas import Series
ser=Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
A=['a','b','c','d','e']
ser.reindex(A)
a -5.3
b 7.2
c 3.6
d 4.5
e NaN
dtype: float64
ser=ser.reindex(A,fill_value=0)
ser
a -5.3
b 7.2
c 3.6
d 4.5
e 0.0
dtype: float64
ser.reindex(A,method='ffill')
a -5.3
b 7.2
c 3.6
d 4.5
e 0.0
dtype: float64
ser.reindex(A,fill_value=0,method='ffill')
a -5.3
b 7.2
c 3.6
d 4.5
e 0.0
dtype: float64
前面介绍重置索引时讲过 set_index(),可以对 DataFrame 重新设置某列为索引。
其命令格式如下:
DataFrame.set_index(
keys,
drop=True,
append=False,
inplace=False)
其中:
DataFrame 可以通过set index方法不仅可以设置单索引,而且可以设置复合索引,打造层次化索引。
示例代码如下:
import pandas as pd
df=pd.DataFrame({'a':[1,2,3],'b':['a','b','c'],'c':["A","B","C"]})
df
a | b | c | |
---|---|---|---|
0 | 1 | a | A |
1 | 2 | b | B |
2 | 3 | c | C |
df.set_index(
['b','c'],
drop=False,#保留b、c两列append-True,#保留原来的索引
inplace=False)#保留原df,即不在原df上修改,生成新的数据框
a | b | c | ||
---|---|---|---|---|
b | c | |||
a | A | 1 | a | A |
b | B | 2 | b | B |
c | C | 3 | c | C |
reset_index 可以还原索引,使索引重新变为默认的整型索引,即 reset_index 是set_index的“逆运算”。
其命令格式如下:
df.reset_index(level=None,drop=False,inplace=False,col_level=0,col_fill=")
参数level控制了具体要还原的那个等级的索引。
示例代码如下:
import pandas as pd
df = pd. DataFrame ({ 'a' : [1,2,3], 'b' : ['a' , ' b' , ' c' ], 'c' : ["A","B","C"]})
df1=df.set_index(['b' , 'c'],drop=False, append=True, inplace=False)
df1
a | b | c | |||
---|---|---|---|---|---|
b | c | ||||
0 | a | A | 1 | a | A |
1 | b | B | 2 | b | B |
2 | c | C | 3 | c | C |
df1.reset_index(level='b',drop=True,inplace=False,col_level='0')
a | b | c | ||
---|---|---|---|---|
c | ||||
0 | A | 1 | a | A |
1 | B | 2 | b | B |
2 | C | 3 | c | C |
注意在使用sort_index对DataFrame进行排序的时候,不能直接对index和columns都含有的字段进行排序,会报错。
记录合并是指两个结构相同的数据框合并成一个数据框, 也就是在 个数
据框中追加另一个数据框的数据记录。
其命令格式如下:
concat([dataFramel,dataFrame2……1)
参数说明:DataFrame1表示数据框。
返回值:DataFrame。
示例代码如下:
from pandas import read_excel
df1 = read_excel('i_nuc.xls',sheet_name='Sheet3')
df1.head()
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
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 |
df2=read_excel(r'i_nuc.xls',sheet_name='Sheet5')
df2
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 2308024501 | 23080245 | 李同 | 男 | 64 | 96 | 91 | 69 | 60 | 77 |
1 | 2308024502 | 23080245 | 王致意 | 女 | 73 | 74 | 93 | 70 | 71 | 75 |
2 | 2308024503 | 23080245 | 李同维 | 男 | 85 | 60 | 85 | 72 | 72 | 83 |
3 | 2308024504 | 23080245 | 池莉 | 男 | 60 | 50 | 89 | 71 | 76 | 71 |
df=pandas.concat ([df1, df2])
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 |
0 | 2308024501 | 23080245 | 李同 | 男 | 64 | 96 | 91 | 69 | 60 | 77 |
1 | 2308024502 | 23080245 | 王致意 | 女 | 73 | 74 | 93 | 70 | 71 | 75 |
2 | 2308024503 | 23080245 | 李同维 | 男 | 85 | 60 | 85 | 72 | 72 | 83 |
3 | 2308024504 | 23080245 | 池莉 | 男 | 60 | 50 | 89 | 71 | 76 | 71 |
可以看到两个数据框的数据记录都合并到一起了,实现了数据记录的追加,但是记录的索引并没有顺延,仍然保持着原有的状态。前面讲过合并两个数据框的append方法,再复习一下。
其命令格式如下:
df.append(df2,ignore_index=True)#把df2追加到df上,index直接顺延同样,在concat方法中加一个ignore_index=True参数,index即可顺延。
其命令格式如下:
pandas.concat([df1,df2],ignore_index=True)
学段合并是指将同一个数据框中的不同列进行合并,形成新的列。其命令格式如下:
X =x1+x2+*…
参数说明:
示例代码如下:
from pandas import DataFrame
df = DataFrame ( {'band':[189,135,134,133],'area':['0351','0352','0354','0341'],'num': [2190,8513,8080,7890]})
df
band | area | num | |
---|---|---|---|
0 | 189 | 0351 | 2190 |
1 | 135 | 0352 | 8513 |
2 | 134 | 0354 | 8080 |
3 | 133 | 0341 | 7890 |
字段匹配是指不同结构的数据框(两个或两个以上的数据框),按照一定的条件进行匹配合并,即追加列,类似于Excel中的VLOOKUP函数。例如,有两个数据表,第一个表中有学号、姓名,第二个表中有学号、手机号,现需要整理一份数据表,包含学号、姓名、手机号,此时则需要用到merge函数。
其命令格式如下:
merge(x,Y,left _on,right_on)
参数说明:
示例代码如下:
import pandas as pd
from pandas import read_excel
df1= pd.read_excel('i_nuc.xls',sheet_name ='Sheet3')
df1.head()
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
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 |
df2=pd.read_excel(r'i_nuc.xls',sheet_name ='Sheet4')
df2.head ()
学号 | 电话 | IP | |
---|---|---|---|
0 | 2308024241 | 1.892225e+10 | 221.205.98.55 |
1 | 2308024244 | 1.352226e+10 | 183.184.226.205 |
2 | 2308024251 | 1.342226e+10 | 221.205.98.55 |
3 | 2308024249 | 1.882226e+10 | 222.31.51.200 |
4 | 2308024219 | 1.892225e+10 | 120.207.64.3 |
df-pd.merge(df1,df2,left_on='学号',right_on='学号')
df.head()
band | area | num | |
---|---|---|---|
0 | 189 | 0351 | 2190 |
1 | 135 | 0352 | 8513 |
2 | 134 | 0354 | 8080 |
3 | 133 | 0341 | 7890 |
简单计算是指通过对各字段进行加、减、乘、除等四则算术运算,得出的结果作为新的字段
示例代码如下:
from pandas import read_excel
df = read_excel (r'i_nuc.xls',sheet_name='Sheet3')
df.head ()
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
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 |
jj=df['解几'].astype (int)#将df 中的“解几”转化为int类型
gd=df['高代'].astype(int)
df['数分+解几']=jj+gd #在df 中新增“数分+解几”列,值为:jj+gd
df.head()
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | 数分+解几 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2308024241 | 23080242 | 成龙 | 男 | 76 | 78 | 77 | 40 | 23 | 60 | 83 |
1 | 2308024244 | 23080242 | 周怡 | 女 | 66 | 91 | 75 | 47 | 47 | 44 | 91 |
2 | 2308024251 | 23080242 | 张波 | 男 | 85 | 81 | 75 | 45 | 45 | 60 | 105 |
3 | 2308024249 | 23080242 | 朱浩 | 男 | 65 | 50 | 80 | 72 | 62 | 71 | 133 |
4 | 2308024219 | 23080242 | 封印 | 女 | 73 | 88 | 92 | 61 | 47 | 46 | 93 |
数据标准化(归一化)处理是数据分析和挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。
数据标准化常用的方法为:
(1) min-max标准化(Min-Max Normalization)
又名离差标准化,是对原始数据的线性转化公式如下:
X ∗ = ( x − m i n ) / ( m a x − m i n ) X*=(x-min)/(max-min) X∗=(x−min)/(max−min)
其中,max为样本最大值;min为样本最小值。当有新数据加入时需要重新进行数据归一化。
from pandas import read_excel
df = read_excel(r'i_nuc.xls',sheet_name='Sheet3')
df.head()
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
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 |
scale= (df.数分.astype(int)-df.数分.astype (int).min() )/(df.数分.astype(int).max ()-df.数分.astype(int).min())
scale.head ()
0 0.000000
1 0.184211
2 0.131579
3 0.842105
4 0.552632
Name: 数分, dtype: float64
(2) Z-score 标准化方法Z-score
标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。这种方法给予原始数据的均值(Mean)和标准差(Standard Deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:
X ∗ = ( x − μ ) / σ X^{*}=(x-\mu) / \sigma X∗=(x−μ)/σ
其中,为所有样本数据的均值,。为所有样本数据的标准差。
将数据按其属性(按列进行)减去其均值,并除以其标准差,得到的结果是,对于每个属性(每列)来说所有数据都聚集在0附近,标准差为1。
使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化:
from sklearn import preprocessing
import numpy as np
df1=df['数分']
df_scaled = preprocessing.scale (df1)
df_scaled
array([-2.50457384, -1.75012229, -1.96567988, 0.94434751, -0.2412192 ,
0.83656872, -0.2412192 , 0.62101114, 0.18989597, -0.34899799,
-0.34899799, 0.08211717, -0.2412192 , 0.51323234, -0.2412192 ,
-0.02566162, 1.59102027, 0.62101114, 0.72878993, 0.94434751,
0.83656872])
也可以使用sklearn.preprocessing.StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、标准差),直接使用其对象转换测试集数据:
X = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])
X
array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
scaler = preprocessing.StandardScaler().fit(X)
scaler
StandardScaler()
scaler.mean_
array([1. , 0. , 0.33333333])
scaler.transform(X)
array([[ 0. , -1.22474487, 1.33630621],
[ 1.22474487, 0. , -0.26726124],
[-1.22474487, 1.22474487, -1.06904497]])
#可以直接使用训练集对测试集数据进行转换
scaler.transform ([ [-1., 1., 0.]])
array([[-2.44948974, 1.22474487, -0.26726124]])
数据分组是指根据数据分析对象的特征,按照一定的数据指标, 把数据划
分为不同的区间来进行研究,以揭示其内在的联系和规律性。简单来说,就是
新增一列, 将原来的数据按照其性质归入新的类别中。其命令格式如下:
示例代码如下:
from pandas import read_excel
import pandas as pd
df = pd.read_excel (r'rz.xlsx')
df.head ()#查看前5行数据
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | |
---|---|---|---|---|---|---|---|---|---|---|
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 |
df.shape
(21, 10)
bins=[min(df.解几)-1,60,70,80,max(df.解几)+1]
lab=["不及格","及格","良好","优秀"]
demo=pd.cut (df.解几,bins,right=False, labels=lab)
demo.head()#仅显示前5行数据
0 及格
1 不及格
2 及格
3 良好
4 不及格
Name: 解几, dtype: category
Categories (4, object): ['不及格' < '及格' < '良好' < '优秀']
df[ 'demo']=demo
df.head ()
学号 | 班级 | 姓名 | 性别 | 英语 | 体育 | 军训 | 数分 | 高代 | 解几 | demo | |
---|---|---|---|---|---|---|---|---|---|---|---|
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 | 不及格 |
上面代码中 bins 有个“坑点”:最大值的取法,即 max(df. 解几)+1中要有一个大于前一个数 (80),否则会提示出错。如本例中最大的分值为84,若设置 bins 为 bins=[min(df.解几)-1,60,70,80,90,max(df.解几)+1],貌似“不及格”“及格”“中等”“良好”“优秀”都齐了,但是会报错,因为最后一项“max(df解几)+1”其实等于 84+1,也就是85,比前一项90小,这不符合单调递增原则。遇到这种情况,最好先把最大值和最小值求出来,再分段。
日期转换是指将字符型的日期格式转换为日期格式数据的过程。
其命令格式如下:
to_datetime(dateString ,format)
其中, format格式有:
示例代码如下:
from pandas import read_csv
from pandas import to_datetime
df = read_csv ('rz3.csv', sep=',',encoding='utf8')
df
Unnamed: 0 | num | pr ice | year | month | date | |
---|---|---|---|---|---|---|
0 | 0 | 123 | 159 | 2016 | 1 | 2016/6/1 |
1 | 1 | 124 | 753 | 2016 | 2 | 2016/6/2 |
2 | 2 | 125 | 456 | 201 6 | 3 | 2016/6/3 |
3 | 3 | 126 | 852 | 201 6 | 4 | 2016/6/4 |
4 | 4 | 127 | 210 | 2016 | 5 | 2016/6/5 |
5 | 5 | 115 | 299 | 201 6 | 6 | 2016/6/6 |
6 | 6 | 102 | 699 | 2016 | 7 | 2016/6/7 |
7 | 7 | 201 | 599 | 2016 | 8 | 2016/6/8 |
8 | 8 | 154 | 199 | 2016 | 9 | 2016/6/9 |
9 | 9 | 142 | 899 | 2016 | 10 | 2016/6/10 |
示例代码如下:
from pandas import read_csv
from pandas import to_datetime
from datetime import datetime
# df_dt = to_datetime (df.注册时间,format='%Y/%m/%d');
# df_dt_str = df_dt.apply(df.注册时间, format='%Y/%m/%d')
df = read_csv('rz3.csv', sep=',',encoding='utf8')
df_dt =to_datetime(df.date, format="%Y/%m/%d")
df_dt_str=df_dt.apply(lambda x: datetime.strftime (x, "%Y/%m/%d"))#apply用法见下面的注意提示
df_dt_str
0 2016/06/01
1 2016/06/02
2 2016/06/03
3 2016/06/04
4 2016/06/05
5 2016/06/06
6 2016/06/07
7 2016/06/08
8 2016/06/09
9 2016/06/10
Name: date, dtype: object
日期抽取是指从日期格式里面抽取出需要的部分属性。其命令格式如下:
data dt.dt.property
其中:
其中,property有:
示例代码如下:
from pandas import read_csv;
from pandas import to_datetime;
df = read_csv('rz3.csv', sep=',',encoding='utf8')
df
Unnamed: 0 | num | pr ice | year | month | date | |
---|---|---|---|---|---|---|
0 | 0 | 123 | 159 | 2016 | 1 | 2016/6/1 |
1 | 1 | 124 | 753 | 2016 | 2 | 2016/6/2 |
2 | 2 | 125 | 456 | 201 6 | 3 | 2016/6/3 |
3 | 3 | 126 | 852 | 201 6 | 4 | 2016/6/4 |
4 | 4 | 127 | 210 | 2016 | 5 | 2016/6/5 |
5 | 5 | 115 | 299 | 201 6 | 6 | 2016/6/6 |
6 | 6 | 102 | 699 | 2016 | 7 | 2016/6/7 |
7 | 7 | 201 | 599 | 2016 | 8 | 2016/6/8 |
8 | 8 | 154 | 199 | 2016 | 9 | 2016/6/9 |
9 | 9 | 142 | 899 | 2016 | 10 | 2016/6/10 |
df_dt =to_datetime (df.date,format='%Y/%m/%d')
df_dt
0 2016-06-01
1 2016-06-02
2 2016-06-03
3 2016-06-04
4 2016-06-05
5 2016-06-06
6 2016-06-07
7 2016-06-08
8 2016-06-09
9 2016-06-10
Name: date, dtype: datetime64[ns]
df_dt.dt.year
0 2016
1 2016
2 2016
3 2016
4 2016
5 2016
6 2016
7 2016
8 2016
9 2016
Name: date, dtype: int64
df_dt.dt.day
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
Name: date, dtype: int64
df_dt.dt.month
df_dt.dt.weekday
df_dt.dt.second
df_dt.dt.hour
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
Name: date, dtype: int64