0. Pandas数据结构分析
0.1 Series
Series是一个类似一维数组的对象,他能够保存任何类型的数据,由左面的索引和右面的数据两部分组成。
0.1.1 语法:
1 | pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False) |
部分参数:
- data:数据
- index:索引
0.1.2 使用:
代码:
1 | import pandas as pd |
输出:
1 | data为: |
0.2 DataFrame
DataFrame是一个类似于二维数组或表格,他每列的数据可以是不同的数据类型。
0.2.1 语法
1 | pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False) |
部分参数说明:
- index:表示行标签,若不设置参数则默认自动创建一个从0~N的整数索引
- columns:列标签
0.2.2 使用:
代码:
1 | import pandas as pd |
输出:
1 | df= |
1. Pandas索引操作及高级索引
1.1 对象索引
索引对象无法进行单独修改,保证数据安全,但是可以整体设置,例如:
1 | import pandas as pd |
如果输入代码第6
行代码会报错:
TypeError: Index(…) must be called with a collection of some kind, ‘zz’ was passed
正确的代码输出为:
1 | 跳高 跳远 竞走 跑圈 |
1.2 重置索引
Pandas中提供了一个重要方法reindex()
,该方法的作用是对原索引和新索引进行匹配,也就是说,新索引含有原索引的数据,而原索引数据按照新索引排序。如果新索引中没有原索引数据,那么程序不仅不会报错而且会添加新索引并将值填充为NaN
或者使用fill_values()
填充其他值。
1.2.1 reindex()
方法
语法:
1 | DataFrame.reindex(labels=None,index=None,columns=None,axis=None,method=None,copy=True,level=None,fill_value=nan,limit=None,tolerance=None) |
部分参数解释:
index
:用作索引的新序列method
:插值填充方式fill_value
:引入缺失值时使用的替代值limit
:前向或后向填充时的最大填充量
代码:
1 | import pandas as pd |
输出:
1 | a 3 |
1.3 索引操作
1.3.1 Series索引
基础索引
Series有关索引与Numpy相似,对于Series索引既可通过位置也可通过index
(索引名称)获取:
1 | import pandas as pd |
输出为:
1 | 位于2位置的元素为: 3 |
Series切片索引
由于Series的索引有两种形式,因此切片也有两种形式但是有一点点区别:
- 位置索引:包括起始位置不包括终止位置
- 名称索引:包括起始位置和终止位置
语法:
1 | pandas[start:stop:step] |
代码:
1 | import pandas as pd |
输出:
1 | 位置在[2,6)之间的元素为: |
语法:
1 | pandas[start:stop:step] |
代码:
1 | import pandas as pd |
输出:
1 | 名称在[c,g]之间的元素为: |
不连续索引
代码:
1 | import pandas as pd |
输出:
1 | b 2 |
布尔型索引
返回符合表达式的变量。
代码:
1 | import pandas as pd |
输出:
1 | g 7 |
1.3.2 DataFrame索引
基础索引
语法:
1 | DataFrame[index][column] |
✅ 基础语法只能为先行后列,index
仅可使用切片,column
可以为切片或元素,因此当DataFrame索引只有一个对象时使用名称索引会直接匹配列即column
参数。
代码:
1 | import numpy as np |
输出:
1 | 两参数索引: |
高级索引
Pandas库中提供了操作索引的方法来访问数据,具体包括:
- loc:基于标签索引(索引名称,如a、b等),用于按标签选取数据,当执行切片操作时既包含起始索引也包括结束索引。
- iloc:基于位置索引(整数索引,从0到length-1),用于按位置选取数据。当执行切片操作时,只包含起始索引不包括结束索引。
ilog
主要使用整数来索引数据而不能使用字符标签来索引数据,而loc
只能使用字符标签来索引数据而不能使用整数来索引数据。
代码:
1 | import numpy as np |
输出:
1 | a c |
代码:
1 | import numpy as np |
输出:
1 | c a |
loc
和iloc
函数第一个参数是行索引,例如:1
2
3
4import numpy as np
import pandas as pd
data = pd.DataFrame(np.arange(16).reshape(4, 4), columns=['a', 'b', 'c', 'd'])
print(data.iloc[1:3, [2, 0]])
输出为:1
2
3 c a
1 6 4
2 10 8
2. 算术运算与数据对齐
在Pandas中Series对象进行运算时,索引长度不同的Series对象进行运算缺失值处会填充为NaN
,如果希望使用NaN
填充缺失数据可以使用方法中的fill_value
参数,例子以加法为例:
1 | import pandas as pd |
输出为:
1 | 0 1.0 |
即:
3. 数据排序
3.1 按索引排序
3.1.1 语法
1 | sort_index(axis=0,level=None,ascending=True,inplace=False,kind='quicksort',na_position='last',sort_remaining=True) |
部分参数说明:
axis
:轴索引,0
表示index
(行),1
表示columns
(列)level
:若不为None
,则对指定索引级别的值进行排序ascending
:是否升序排序,默认True
表示升序inplace
:默认为False
表示对数据表进行排序不创建新实例kind
:选择排序算法
3.1.2 Series对象
直接排序
代码:
1 | import pandas as pd |
输出:
1 | 1 0 |
降序排序
代码:
1 | import pandas as pd |
输出:
1 | 7 2 |
3.1.3 DataFrame对象
按行索引升序排序
代码:
1 | import numpy as np |
输出:
1 | 8 2 1 3 |
按列索引降序排序
代码:
1 | import numpy as np |
输出:
1 | 8 3 2 1 |
3.2 按值排序
3.2.1 语法
1 | sort_values(by,axis=0,level=None,ascending=True,inplace=False,kind='quicksort',na_position='last') |
部分参数说明:
by
:排序的列axis
:轴索引,0
表示index
(行),1
表示columns
(列)level
:若不为None
,则对指定索引级别的值进行排序ascending
:是否升序排序,默认True
表示升序na_position
:如果设置为first
则会将NaN
值放在开头;如果设置为last
则会将NaN
值放在最后。
3.2.2 Series对象
升序排序
代码:
1 | import numpy as np |
输出:
1 | 4 -2.0 |
3.2.3 DataFrame对象
列索引排序
代码:
1 | import pandas as pd |
输出:
1 | 0 1 2 3 |
4. 统计计算与描述
4.1 常用的统计计算
函数名称 | 说明 | 函数名称 | 说明 |
---|---|---|---|
sum |
和 | std |
标准差 |
mean |
平均值 | skew |
三阶矩 |
median |
中位数 | kurt |
四阶矩 |
max |
最大值 | min |
最小值 |
idxmax |
最大索引值 | idxmin |
最小索引值 |
count |
非NaN 值的个数 |
head |
获取前N个值 |
var |
方差 | cumsum |
累积和 |
cummin |
累积最小值 | cummax |
累积最大值 |
cumprod |
累计积 | describe |
列计算汇总 |
示例代码
1 | import numpy as np |
输出:
1 | 原数据: |
4.2 describe
统计描述
4.2.1 函数语法
1 | describe(percentiles=None,include=None,exclude=None) |
常用参数含义:
percentiles
:输出中包含的百分数,位于[0,1]之间,如果不设置参数则默认为[0.25,0.5,0.75],返回25%,50%,75%分位数。include
、exclude
:指定返回结果的形式
4.2.2 示例代码
1 | import numpy as np |
输出:
1 | a b c d |
参照数组:
1 | a b c d |
5.层次化索引
5.1 认识层次化索引
在一个轴方向上有多层索引。如图:
Series和DataFrame均可以实现层次化索引,最常见的方式是在构造方法的index参数中传入一个嵌套列表。
5.1.1 Series
对象层次化索引
例如:
1 | import pandas as pd |
输出为:
1 | 河北省 石家庄市 12462 |
5.1.2 DataFrame
对象层次化索引
例如:
1 | import pandas as pd |
输出:
1 | 占地面积 |
5.2 常用方法
层次化索引除了直接创建之外还可以通过MultiIndex
类的方法构建层次化索引,这个类提供了三种创建层次化索引的方法:
MultiIndex.from_tuples()
:将元组列表转换为MultiIndex
MultiIndex.from_arrays()
:将数组列表转换为MultiIndex
MultiIndex.from_product()
:从多个集合的笛卡尔乘积中创建MultiIndex
from_tuples()
方法可以将包含若干个元组的列表转换为MultiIndex
对象,其中元组的第一个元素作为外层索引,第二个元素作为内层索引,例如:
1 | import pandas as pd |
输出为:
1 | 0 1 2 |
from_arrays()
方法是将数组列表转换为MultiIndex
对象,其中嵌套的第一个列表将作为外层索引,嵌套的第二个列表将作为内层索引。例如:
1 | import pandas as pd |
输出:
1 | 0 1 2 |
from_product()
方法表示从多个集合的笛卡尔乘积创建一个MultiIndex
对象。
例如:
1 | import numpy as np |
输出为:
1 | 0 1 |
5.3 层次化索引操作
任务一:录入下面层次化对象
代码:
1 | import pandas as pd |
输出:
1 | 机械 张三 78 |
任务二:筛选外层索引为机械的数据
代码:
1 | print(ser_obj['机械']) |
输出:
1 | 张三 78 |
任务三:筛选内层索引为李四的数据
代码:
1 | print(ser_obj[:, '李四']) |
输出:
1 | 机械 65 |
任务四:交换分层顺序
代码:
1 | print(ser_obj.swaplevel()) |
输出:
1 | 张三 机械 78 |
任务五:索引排序
sort_index()
语法
1 >sort_index(axis=0,level=None,ascending=True,inplace=False,kind='quicksort',na_position='last',sort_remaining=True,by=None)
by
:表示按指定的值排序ascending
:布尔值,表示是否升序排列,默认为True
代码:
1 | print(ser_obj.sort_index()) |
输出:
1 | 信息 宋天 98 |
任务六:录入下面的层次化对象并对num
列进行降序排序
代码:
1 | import pandas as pd |
输出:
1 | model num |
6. 数据的读写
6.1 读写文本文件
6.1.1 写入文本文件函数to_csv()
函数语法:
详细参数请查看官方文档:DataFrame.to_csv()
1 | to_csv(path_or_buf=None,sep=',',na_rep='',float_format=None,columns=None,header=True,index=True,index_label=None,mode='w',……) |
path_or_buf
:文件路径index
:默认为True
,若设为False
,则将不会显示索引sep
:分隔符,默认用”,”隔开
代码:
1 | import pandas as pd |
这种方法同样可以输出扩展名为
txt
的文件。
输出:
在本目录会生成一个text.csv
的文件,文件内容为:
1 | ,,model,num |
6.1.2 读取文本文件函数read_csv()
函数语法:
详细参数请查看官方文档:Pandas.read_csv()
1 | Pandas.read_csv(filepath_or_buffer,sep=',',delimiter=None,header='infer',names=None,index_col=None,usecols=None,prefix=None,……) |
sep
:指定使用的分隔符,默认用”,”分隔header
:指定行数用来作为列名names
:用于结果的列名列表,如果文件不包含标题行,则应该将参数设置为None
读取Text文件函数
read_table()
与read_csv()
相似,只不过read_table()
函数默认使用”\t”为分隔符。
代码:
读取上文中生成的test.csv
文件
1 | import pandas as pd |
输出:
1 | Unnamed: 0 Unnamed: 1 model num |
可以通过del data['Unnamed: 0']
来删除该列。
6.2 读写EXCEL
文件
excel文件是常见的存储数据文件,它里面均是以二维表格的形式显示的,可以对数据进行统计分析等操作,常见扩展名为.xls
和.xlsx
两种格式,对于excel文件的读写常用的两个方法为to_excel()
和read_excel()
两种方法。
6.2.2 写入excel文件to_excel()
方法
函数语法:
详细参数请查看官方文档:DataFrame.to_excel()
1 | DataFrame.to_excel(excel_writer,sheet_name='Sheet1',na_rep='',float_format=None,columns=None,header=True,index=True,……) |
excel_writer
:表示读取的文件路径sheet_name
:表示工作表名称,默认为Sheet1
na_rep
:表示缺失数据index
:表示是否写行索引,默认为True
代码:
读取上文中生成的test.csv
文件
1 | import pandas as pd |
输出:
将在根目录输出文件名为test.xlsx
的表格,表格内容如图。
6.2.2 读取excel文件read_excel()
方法
注意:有关
Excel
的操作在Python 3.8
下可能会报错,建议使用Python 3.7
函数语法:
详细参数请查看官方文档:Pandas.read_excel()
1 | Pandas.read_excel(io,sheet_name=0,header=0,name=None,index_col=None,**kwds) |
io
:表示路径对象sheet_name
:指定要读取的工作表,默认为0header
:用于解析DataFrame的列标签,默认为0,即取第一列为列标题index_col
:用于解析DataFrame的行标签,默认为None
,如果表格中第一列为索引则将该属性设置为0names
:要使用的列名称
代码:
读取上文中生成的test.xlsx
文件,由于excel中合并的单元格会产生缺失值,使用ffill()
方法进行向下填充。
1 | import pandas as pd |
输出:
1 | Unnamed: 0 Unnamed: 1 model num |
6.3 读写HTML
文件
6.3.1 读取HTML表格方法read_html()
方法
函数语法:
详细参数请查看官方文档:pandas.read_html()
1 | Pandas.read_html(io,match='.+',flavor=None,header=None,index_col=None,skiprows=None,attrs=None) |
io
:表示路径对象header
:表示指定列标题所在的行index_col
:表示指定行标题对应的列attrs
:默认为None,用于表示表格的属性值
代码:
1 | import requests |
输出:
1 | 0 1 2 3 |
6.3.2 写入HTML表格方法to_html()
方法
函数语法:
详细参数请查看官方文档:DataFrame.to_html()
1 | DataFrame.to_html(buf,index,header) |
buf
:输出路径index
:行索引,默认为True
header
:列索引,默认为True
代码:
将上文读取到的表格的前十名写入到test.html
中,不保留行列索引:
1 | html_read[0][:11].to_html('./test.html', index=False, header=False) |
输出:
6.4 读写sql
文件
Padnas支持Mysql、Oracle、SQLite等主流数据库的读写操作,为了高效读取数据库中的数据,需要引入SQLAlchemy软件,引入之后Pandas的io.sql
模块将读写数据库,其中提供的常用函数如下表所示:
函数名称 | 说明 |
---|---|
read_sql_table() |
将读取的整张数据表中的数据转化成DataFrame对象 |
read_sql_query() |
将sql语句读取的结果转换成DataFrame对象 |
read_sql() |
上述两个函数的结合,既可以读数据表也可读SQL语句 |
to_sql() |
将数据写入到SQL数据库中 |
本文将使用mysql数据库,Python需要使用:
1 | pip install mysql-connector-python |
如果使用的是Conda则需要使用:
1 | conda install mysql-connector-python |
安装模块。
6.4.1 写入数据库函数to_sql()
函数语法:
详细参数请查看官方文档:DataFrame.to_sql() Series.to_sql()
1 | to_sql(name,con,schema=None,if_exists='fail',index=True,index_label=None,chunksize=None,dtype=None) |
name
:表示数据库表的名称con
:接收数据库连接信息if_exists
:可以取值为fail
,replace
,append
等,默认为fail
在对数据库进行写入前需要首先创建数据库,使用mysql终端输入:
1 create database test;
代码:
创建一个DataFrame
对象并将其写入test
数据库中的students
表。
1 | from sqlalchemy import create_engine |
输出:
通过在Mysql数据库中输入:
1 | use test; /*使用test数据库*/ |
至此,表格已经创建成功了。
6.4.1 读取数据表函数read_sql()
函数语法:
详细参数请查看官方文档:pandas.read_sql()
1 | pandas.read_sql(sql,con,index_col=None,coerce_float=True,params=None,parse_dates=None,columns=None,chunksize=None) |
sql
:表示被执行的SQL语句con
:接收数据库连接,表示数据库的连接信息columns
:从SQL表中选择列名列表
注意:通过
create_engine()
函数创建连接时,需要指定格式如下:’数据库类型+数据库驱动名称//用户名:密码@机器地址:端口号/数据库名’
代码:
读取上文中test/students
数据表中的内容并写入名称为data_sql
的DataFrame
对象中。
1 | from sqlalchemy import create_engine |
输出:
1 | index 班级 男生人数 女生人数 |