一、简介&安装
Pandas是一个用于数据分析的开源Python库,主要用于处理电子表格等数据,提供了数据快速加载、操作、对齐、与合并等功能。Pandas通过引入两种数据实现了上述功能:DataFrame和Series,DataFrame表示整个电子表格或矩形数据,而Series是DataFrame的单列。
由于Pandas并不是Python标准库的一部分,所以需要额外安装(通过Anaconda安装Python环境时Anaconda也会安装一些常用包,包括Pandas,因此不需要额外安装)。
通过Windows自带的命令提示符安装Pandas:
1.在开始菜单搜索”命令提示符”或”CMD”打开窗口:
2.输入命令进行安装:
# 安装最新版本的pandaspip install pandas# 安装指定版本的pandaspip install pandas==1.4.3# 安装完成后查看pandas信息pip show pandas# 卸载已安装的pandaspip uninstall pandas
二、基础知识介绍
2.1. 加载数据集
不是Python标准库的库在使用之前均需要导入,如下所示:
# 直接导入import pandas
导入Pandas库之后,就可以通过调用read_csv函数来加载CSV数据文件了(案例使用文件下载:iris.csv):
# 默认情况下,read_csv会读取逗号分隔文件df = pandas.read_csv('D:/TJ/python-learn/iris.csv')# 调用head()方法,显示前5行数据print(df.head())
导入Pandas库时,往往会给pandas起个别名,方便后续代码进行调用:
import pandas as pd# 代码调用pandas时,使用别名pd即可df = pd.read_csv('D:/TJ/python-learn/iris.csv')
其中,read_csv是读取csv格式数据文件的函数,常用的参数说明如下:
"""read_csv(filepath, sep, header, names, index_col)filepath:文件路径地址sep:文件分隔符,默认为',',部分csv分隔符为制表符'\t'header:指定为标题行的行号,需要注意的是,大部分情况下Python中的变量都是从0开始编号names:输入标题行,如果文件本身自带标题行,需要指定header=0进行覆盖,否则会将文件自身的标题行当作内容处理index_col:指定为行索引的列序号或者列名称"""
除上述参数外,read_csv函数还有更多其他参数,参数说明可以参考操作文档:[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html?)<br />与read_csv类似的,Pandas还有读取Excel表格文件的函数read_excel,其常用参数说明如下:
"""read_excel(io, sheet_name, header, names, index_col)io:文件路径地址sheet_name:表格文件的Sheet名称header:指定为标题行的行号,需要注意的是,大部分情况下Python中的变量都是从0开始编号names:输入标题行,如果文件本身自带标题行,需要指定header=0进行覆盖,否则会将文件自身的标题行当作内容处理index_col:指定为行索引的列序号或者列名称"""
read_excel的其他参数可以参考文档:[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html?)
2.2. 基础操作
首先,需要明确通过read_csv或read_excel读取的文件返回的结果都是DataFrame对象,DataFrame形式上与我们常见的表格类似,由行和列组成。
import pandas as pddf = pd.read_csv('D:/TJ/python-learn/iris.csv')# 打印df的类型,其中type为Python内置的函数print(type(df))# <class 'pandas.core.frame.DataFrame'># 获取行数和列数print(df.shape)# (150, 6)# 获取列名print(df.columns)# Index(['Number', 'Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width', 'Species'], dtype='object')# 获取每列的类型print(df.dtypes)# Number int64# Sepal.Length float64# Sepal.Width float64# Petal.Length float64# Petal.Width float64# Species object# dtype: object
DataFrame对象中,每列的类型必须相同,而每行可以包含混合类型;同时可以看到,上面的Pandas类型和Python类型并不一致,其对照关系如下:
| Pandas类型 | Python类型 | 说 明 |
|---|---|---|
| object | string | 字符/字符串 |
| int64 | int | 整数 |
| float64 | float | 小数 |
| datetime64 | datetime | 时间类型 |
1. 查看列、行和单元格
(1)获取列子集
# 根据名称获取列子集df1 = df['Sepal.Length']# 通过名称的方式取多列时,需要嵌套一个方括号,这是因为df[]支持str或者list的形式传入参数df2 = df[['Sepal.Length', 'Sepal.Width']]# 上述代码等价于columns_use = ['Sepal.Length', 'Sepal.Width']df3 = df[columns_use]print(df1.head())print(df2.head())print(df3.head())
(2)获取行子集
# 根据行号获取行子集df4 = df.iloc[0]# 通过传入多个行号,一次性获取多行df5 = df.iloc[[0, 1, 2]]# 上述代码等价于row_num = [0, 1, 2]df6 = df.iloc[row_num]print(df4.head())print(df5.head())print(df6.head())# 根据索引标签(行名)获取行子集df7 = df.loc[1]# 通过传入多个行名,一次性获取多行df8 = df.loc[[1, 2, 3]]# 上述代码等价于row_num = [1, 2, 3]df9 = df.iloc[row_num]print(df7.head())print(df8.head())print(df9.head())# 实际上,本例中的df行号和行名是一样的# 如果给df重新设置索引,再执行上面的代码,就会得到不一样的结果df_index = df.set_index(['Number']) # 将Number列设置为索引
(3)混合
loc和iloc属性除了可以用于获取行子集,还可以获取列子集或二者的子集。loc和iloc的一般语法是使用带逗号的方括号,逗号左边是待取子集的行值,逗号右边是待取子集的列值。
# 通过行序号和列序号取子集# 获取第一行第一列cell = df.iloc[0, 0]# 获取前两行中的前两列数据cells = df.iloc[[0, 1], [0, 1]]print(cell)print(cells)# 通过行名称和列名称取子集# 获取列名称为Sepal.Length的第一行的子集cell_1 = df.loc[0, 'Sepal.Length']# 获取列名称分别为Sepal.Length和Sepal.Width的前两行的子集cells_1 = df.loc[[0, 1], ['Sepal.Length', 'Sepal.Width']]# 在上面的代码中,逗号左边应该传入的是行名称(索引标签)# 但是我们在读取数据的时候没有指定索引列,因此pandas会默认使用从0开始的整数序列作为索引# 因此行号和索引标签都是从0开始的整数序列,并且一一对应相等print(cell_1)print(cells_1)# 切片语法# loc和iloc属性都可以使用切片的方法进行取值# 切片的基本表达式为:object[start_index:end_index:step]# 开始索引 start_index :表示的是开始切片的位置# 终止索引 end_index: 表示的结束切片的位置# 步长step :表示切取的步长值,可正可负,step为正时,索引方向为正方向,step为负时,索引方向为负方向,当step值省略时,默认取值为1# 当未写start_index、end_index的值时,默认从索引的端点处开始或结束(包含端点)# 取df的第2到第5行,第一列的子集df.iloc[1:5:1, 0]df.iloc[1:5, 0]df.loc[1:4:1, 'Number']df.loc[1:4, 'Number']# 以上4个表达式等价,其中iloc的切片包含左端点不包含右端点,loc的切片则包含左右端点# 当未写左右端点的值是,则默认从开始到结束全部取(包含端点)# 取第一列的子集df.iloc[::, 0]df.iloc[:, 0]df.loc[::, 'Number']df.loc[:, 'Number']# 自行尝试以下切片的结果df.iloc[0::2, :]df.iloc[:6:2, :]df.iloc[:6:-2, :]df.iloc[::2, :]df.iloc[:, ::]
2. 数据整理
(1)简单计算
Python常用基础运算符同样适用于Pandas中数值类型的数据(int64和float64),结合前面的对列、行和单元格的获取操作进行计算。
result_1 = df.iloc[0, 1] + df.iloc[0, 2]# 8.6result_2 = df.iloc[:, 1] * df.iloc[:, 2]# 返回seriesresult_3 = df.iloc[1, :] + df.iloc[2, :]# 返回seriesresult_4 = df.iloc[:, 1] / 2# 返回series# 分别使用type()查看结果的类型print(type(result_1))print(type(result_2))print(type(result_3))# 查看结果2和结果3的长度(结果1为float类型,不能调用len())print(len(result_2), len(result_3))# 将计算后的结果作为新的行或列加入到原来的df中df.loc[:, 'result_2'] = result_2df.loc['result_3', :] = result_3
Pandas的还自带了常用的统计计算函数:
# 最大值、最小值、平均值、标准差、方差、众数、分位数df.max()df.min()df.mean()df.std()df.var()df.mode()df.quantitle(0.25)# 以上函数,可以通过参数axis=1改成对每一行求值df.max(axis=1)# 还可以对取出来的子集执行上述函数df.loc[:, 'Sepal.Length'].max()
(2)常用操作
在Pandas中,内置了一部分常用的操作函数,通过这些函数可以快捷的对DataFrame进行操作。
# 查看表格基本描述信息df.describe()# 排序,通过ascending的值来控制升序或降序默认ascending=True为升序df.sort_values(by='Number', ascending=False)# 加入axis=1参数使得按行进行排序df.iloc[:, 0:5].sort_values(by=1, axis=1)# 去重df.drop_duplicates(subset='Species')# 去掉包含空值的行# 替换空值df.fillna('这是一个空值')# 删除行或列# 删除标签为0的行df.drop(labels=0)# 删除索引号为0的行df.drop(index=0)# 删除列名为Number的列df.drop(columns='Number')# 将某一列设置为索引df.set_index(keys='Species')# 取消现有索引df.reset_index(level='Species')# 上述常用函数中,调用的结果都是返回一个新的DataFrame,并不会改变原来的DataFrame的值# 如果需要在直接修改原来的DataFrame上,都可以通过加入参数inplace=True来实现(describe函数不行)
