Pandas基础操作
一,Pandas的定义
概述:
Python在数据处理上独步天下:代码灵活、开发快速;尤其是Python的Pandas包,无论是在数据分析领域、还是大数据
开发场景中都具有显著的优势.
Pandas的优势:
- Pandas是Python的一个第三方包,也是商业和工程领域最流行的结构化数据工具集,用于数据清洗、处理以及分析
- Pandas在数据处理上具有独特的优势:
- 底层是基于Numpy构建的,所以运行速度特别的快
- 有专门的处理缺失数据的API
- 强大而灵活的分组、聚合、转换功能
适用场景:
- 数据量大到Excel严重卡顿,且又都是单机数据的时候,我们使用Pandas.
- Pandas用于处理单机数据(小数据集(相对于大数据来说)).
- 在大数据ETL数据仓库中,对数据进行清洗及处理的环节使用Pandas.
二, Pandas数据结构和数据类型
图解 
Pandas中有两大核心对象, 分别是: DataFrame和Series, 其中, Series -> 单列数据, DataFrame -> 多列数据
Series对象入门
(1)Series对象定义
概述:
Series是Pandas中的最基本的数据结构对象,下文中简称s对象;是DataFrame的列对象,series本身也具有索引。
Series是一种类似于一维数组的对象,由下面两个部分组成:
- values:一组数据(numpy.ndarray类型).
- index:相关的数据索引标签.如果没有为数据指定索引,会自动创建一个0到N-1(N为数据的长度)的整数型索引.
图解:
(2)创建Series对象.
创建方法
- 方法一: 通过list列表来创建.
- 方法二: 使用使用字典或元组创建series对象.
- 方法三: 使用numpy创建series对象.
案例
案例需求
演示Series对象的创建
实现思路
- 导包.
- 创建Series对象(s1), 采用: 默认自增索引.
- 打印s1.
- 创建Series对象(s2), 采用: 自定义索引.
- 打印s2.
- 使用字典, 元组创建Series对象.
- 元组形式.
- 打印s3.
- 字典形式.
- 打印s4 .
- 使用numpy创建series对象.
- 打印s5.
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 创建Series对象(s1), 采用: 默认自增索引.
s1 = pd.Series([1, 2, 3, 4, 5])
# 3. 打印s1.
print(s1)
# 4. 创建Series对象(s2), 采用: 自定义索引.
s2 = pd.Series([1, 2, 3, 4, 5], index = ['a', 'b', 'c', 'd', 'e'])
# 5. 打印s2.
print(s2)
# 6. 使用字典, 元组创建Series对象.
# 7. 元组形式.
s3 = pd.Series((11, 22, 33, 44, 55))
# 8. 打印s3.
print(s3)
# 9. 字典形式.
s4 = pd.Series({'a': 1, 'b': 3, 'c': 5})
# 10. 打印s4.
print(s4)
# 11. 使用numpy创建series对象.
s5 = pd.Series(np.arange(5))
# 12. 打印s5.
print(s5)
结果图解
(3)Series对象的属性
Series对象的属性:
- Series对象的索引列(的值): Series对象.index
- Series对象的值列(的值): Series对象.values
- Series对象 根据 索引列(的值) 获取 值列(的值): Series对象[索引列(的值)]
- Series对象 根据 索引列(的值) 修改 值列(的值): Series对象[索引列(的值)] = 新的值列(的值)
案例
案例需求
演示Series对象的属性
实现思路
- 导包.
- 创建Series对象, 索引为: A-F, 值为: 0-5
- 加入列表推导式.
- 获取Series对象的 索引列(的值).
- 获取Series对象的 值列(的值).
- Series支持根据 索引列(的值) 获取 值列(的值), 即: Series对象[索引值].
- Series对象 根据 索引列(的值) 修改 值列(的值): Series对象[索引列(的值)] = 新的值列(的值).
# 1. 导包.
import pandas as pd
inport numpy as np
# 2. 创建Series对象, 索引为: A-F, 值为: 0-5.
# s6 = pd.Series(data = [0, 1, 2, 3, 4, 5], index = ['A', 'B', 'C', 'D', 'E', 'F'])
# 3. 加入列表推导式.
s6 = pd.Series(data = [i for i in range(6)], index = [i for i in 'ABCDE'])
print(s6)
# 4. 获取Series对象的 索引列(的值).
print(s6.index) # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype = 'object')(字符串)
# 5. 获取Series对象的 值列(的值).
print(s6.values) # [0 1 2 3 4 5]
# 6. Series支持根据 索引列(的值) 获取 值列(的值), 即: Series对象[索引值].
print(s6['D']) # 3
# 7. Series对象 根据 索引列(的值) 修改 值列(的值): Series对象[索引列(的值)] = 新的值列(的值).
s6['D'] = 99
print(s6)
DataFrame对象入门
(1)DataFrame对象定义
概述:
DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引.
- 行索引,表明不同行,横向索引,叫index,0轴,axis=0
- 列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
图解:
(2)创建DataFrame对象
创建方法
- 方法一: 通过 字典 + 列表 的方式实现.
- 方法二: 通过 列表 + 元组 的方式实现.
- 方法三: 通过 numpy的 ndarray 对象转化为pandas的 DataFrame 对象的方式实现.
(3)案例1
案例需求
演示DataFrame对象的创建
实现思路
- 导包.
- 场景1: 通过 字典 + 列表 , 并使用默认自增索引的方式实现.
- 准备数据集, 每个键值对 = 1列数据.
- 把上述的数据集, 封装成DataFrame对象(df1).
- 打印(df1)结果.
- 场景2: 通过 列表 + 元组 , 并使用自定义索引的方式实现.
- 准备数据集, 每一个元组 = 1行数据.
- 把上述的数据集和自定义索引, 封装成DataFrame对象(df2).
- 打印(df2)结果.
- 场景3: 通过 numpy的ndarray 对象转化为pandas的 DataFrame 对象的方式实现.
- 创建 numpy的 ndarray对象(arr3).
- 打印(arr3)结果.
- 把上述的ndarray对象, 封装成DataFrame对象(df3).
- 打印(df3)结果.
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 场景1: 通过 字典 + 列表 , 并使用默认自增索引的方式实现.
# 3. 准备数据集, 每个键值对 = 1列数据.
info = {
'name': ['水冷哥', '深情哥', '紫琪', '德华'],
'gender': ['女', '男', '保密', '保密'],
'age': [81, 80, 66, 55]
}
# 4. 把上述的数据集, 封装成DataFrame对象(df1).
df1 = pd.DataFrame(data = info)
# 5. 打印(df1)结果.
df1
# 6. 场景2: 通过 列表 + 元组 , 并使用自定义索引的方式实现.
# 7. 准备数据集, 每一个元组 = 1行数据.
info = [
('刘亦菲', '女', 39),
('迪丽热巴', '女', 31),
('王志奇', '未知', 66)
]
# 8. 把上述的数据集和自定义索引, 封装成DataFrame对象(df2).
df2 = pd.DataFrame(
data = info,
columns = ['姓名', '性别', '年龄'],
index = ['人物1', '人物2', '人物3'] # 手动指定索引
)
# 9. 打印(df2)结果.
df2
# 10. 场景3: 通过 numpy的ndarray 对象转化为pandas的 DataFrame 对象,并使用自定义索引的方式实现.
# 11. 创建 numpy的 ndarray对象(arr3).
arr3 = np.array(12).reshape(3, 4)
# 12. 打印(arr3)结果.
arr1
# 13. 把上述的ndarray对象, 封装成DataFrame对象(df3).
df3 = pd.DataFrame(
data = arr3,
columns = ['a', 'b', 'c', 'd']
)
# 14. 打印(df3)结果.
df3
结果图解
案例2:DataFrame简单案例 -> 学生信息处理
案例需求
生成10名学生5门功课的成绩的学生信息表
实现思路
- 导包.
- 生成10名学生, 5门功课的成绩, 成绩范围: 40 ~ 100.
- 方法1.
- 修改DataFrame对象的 列名 和 索引数值.
- 将修改DataFrame对象的 列名 和 索引数值传给DataFrame对象.
- 方法2.
- rename函数也可以(一个一个值修改).
- 方法3.
- 修改DataFrame对象的 列名 和 索引数值.
- rename函数 + 循环遍历DataFrame对象的 列名 和 索引数值.
- 打印修改后的结果.
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 生成10名学生, 5门功课的成绩, 成绩范围: 40 ~ 100.
score_df = pd.DataFrame(np.random.randint(40, 101, (10, 5))) # 10行, 5列 包左不包右
score_df
# 3. 方法1
# 4. 修改DataFrame对象的 列名 和 索引数值.
# column_names = ['语文', '数学', '英语', '政治', '体育']
# index_names = ['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9']
# index_names= ['同学' + str(i) for i in range(score_df.shape[0])]
# 5. 将修改DataFrame对象的 列名 和 索引数值传给DataFrame对象.
# score_df.columns = column_names
# score_df.index = index_names
# 6. 方法2.
# 7. rename函数也可以(一个一个值修改).
# score_df.name(index = {0: '同学0', 1: '同学1', ...}, columns = {0: 'AI课程', 1: '大数据课程'...}, inplace = True)
# 8. 方法3.
# 9. 修改DataFrame对象的 列名 和 索引数值.
column_names = ['语文', '数学', '英语', '政治', '体育']
# index_names = ['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9']
index_names= ['同学' + str(i) for i in range(score_df.shape[0])]
# 10. rename函数 + 循环遍历DataFrame对象的 列名 和 索引数值.
score_df.rename(
# i 的值: 0 ~ 9.
index = {i: index_names[i] for i in range(score_df.shape[0])},
# i 的值: 0 ~ 4.
columns = {i: colunm_names[i] for i in range(score_df.shape[1])},
inplace = True
)
# 11. 打印修改后的结果.
score_df
结果图解
(3)DataFrame对象的属性
DataFrame对象的属性:
- DataFrame对象的索引列(的值): DataFrame对象.index
- DataFrame对象的数据(的值): DataFrame对象.values
- DataFrame对象的列名(的值): DataFrame对象.columns
- DataFrame对象的维度(的值): DataFrame对象.shape
- DataFrame对象的行列转置: DataFrame对象.T
案例
案例需求
演示DataFrame对象的属性
实现思路
- 导包.
- 创建DataFrame对象.
- 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
- 修改DataFrame对象的 列名 和 索引数值.索引为: A-F, 列为: G-K
- 获取DataFrame对象的 索引列(的值).
- 获取DataFrame对象的 列名(的值).
- 获取DataFrame对象的 数据(的值).
- 获取DataFrame对象的 维度(的值).
- 获取DataFrame对象的 行列转置.
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 创建DataFrame对象.
# 3. 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
df = pd.DataFrame(np.random.randint(0, 31, (6, 5))) # 6列, 5行 包左不包右
# 4. 修改DataFrame对象的 列名 和 索引数值.索引为: A-F, 列为: G-K
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.columns = ['G', 'H', 'I', 'J', 'K']
# 5. 获取DataFrame对象的 索引列(的值).
print(df.index) # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
# 6. 获取DataFrame对象的 列名(的值).
print(df.columns) # Index(['G', 'H', 'I', 'J', 'K'], dtype='object')
# 7. 获取DataFrame对象的 数据(的值).
print(df.values)
# 8. 获取DataFrame对象的 维度(的值).
print(df.shape) # (6, 5)
# 9. 获取DataFrame对象的 行列转置.
print(df.T)
结果图解
DataFrame的基本函数
基本函数的常见操作
编号 | 函数 | 作用 |
---|---|---|
1 | head(n) | 查看前n行的数据(默认是5行) |
2 | tail(n) | 查看后5行的数据(默认是5行) |
3 | info() | 查看df对象的详细信息 |
4 | describe() | 查看df对象的 描述性 统计信息 |
5 | reset_index(drop = True) | 重置索引 |
6 | set_index() | 重新设置索引 |
案例
案例需求
演示DataFrame的基本函数的常见操作
实现思路
- 导包.
- 创建DataFrame对象(df).
- 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
- 修改DataFrame对象的 列名 和 索引数值.索引为: A-F, 列为: G-K.
- 查看df对象.
- 查看前5行数据.
- 查看前3行数据.
- 查看后5行数据.
- 查看后3行数据.
- 查看df对象的详细信息.
- 查看df对象的 描述性 统计信息.
- 重置列索引.
- 重新设置列索引.
# 1. 导包.
import pandas as pa
import numpy as np
# 2. 创建DataFrame对象(df).
# 3. 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
df = pd.DataFrame(np.random.randint(0, 31,(6, 5))) # 6列, 5行 包左不包右
# 4. 修改DataFrame对象的 列名 和 索引数值.索引为: A-F, 列为: G-K.
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.columns = ['G', 'H', 'I', 'J', 'K']
# 5. 查看df对象.
df
# 6. 查看前5行数据.
df.head()
# 7. 查看前3行数据.
df.head(3)
# 8. 查看后5行数据.
df.tail()
# 9. 查看后3行数据.
df.tail(3)
# 10. 查看df对象的详细信息.
df.info()
# 11. 查看df对象的 描述性 统计信息.
df.describle()
# 12. 重置列索引.
df.reset_index(drop = False) # drop = False, 默认值, 不是删除原索引列, 将原索引列转移到第一列
df.reset_index(drop = True) # drop = True, 删除原索引列
# 13. 重新设置列索引.
# df.set_index('G') # 'G'充当索引列
# 'J', 'K'充当索引列.
df.set_index('J', 'K')
结果图解
三, Pandas的数据类型
Pandas的数据类型介绍
编号 | 数据类型 | 说明 | 对应的Python类型 |
---|---|---|---|
1 | object | 字符串类型 | string |
2 | int | 整数类型 | int |
3 | float | 浮点数类型 | float |
4 | datetime | 日期时间类型 | datetime包中的datetime类型 |
5 | timedelta | 时间差类型 | datetime包中的timedelta类型 |
6 | category | 分类类型 | 无原生类型, 可以自定义 |
7 | bool | 布尔类型 | bool (True, False) |
8 | nan | 空值类型 | None |
案例
案例需求
演示Pandas的数据类型
实现思路
案例1: 演示 object类型, int类型, float类型, bool类型, nan类型
- 导包.
- 创建DataFrame对象(df1).
- 查看df1对象.
- 查看df1对象的详细信息.
# 1. 导包
import pandas as pd
import numpy as np
# 2. 创建DataFrame对象(df1).
df1 = pd.DataFrame({
'number': [1, 2, 3, 4],
'name': [np.NaN, '深情哥', '紫琪', '德华'],
'gender': ['女', np.NAN, '保密', np.nan],
'age': [81.1, 80.2, 33.3, 55],
'Marriage': [False, False, True, False]
})
# 3. 查看df1对象.
df1
# 4. 查看df1对象的详细信息.
df1.info()
结果图解
案例2: 演示 datetime类型
- 导包.
- 创建DataFrame对象(df2).
- 查看df2对象.
- 查看df2对象的详细信息.
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 创建DataFrame对象(df2).
df2 = pd.DataFrame(['2025-03-29', '2025-03-30', '2025-03-31'], dtype = 'datatime64[ns]')
# 3. 查看df2对象.
df2
# 4. 查看df2对象的详细信息.
df2.info()
结果图解
案例3: 演示 timedelta类型
- 导包.
- 设置起始日期.
- 设置结束日期.
- 打印结果
- 打印类型
# 1. 导包.
import pandas as pd
# 2. 设置起始日期.
start_date = pd.to_datetime('2004-08-21')
# 3. 设置结束日期.
end_date = pd.to_datetime('2025-03-29')
# 4. 打印结果.
print(end_date - start_date) # 7525 days 00:00:00
# 5. 打印类型.
print(type(end_date - start_date)) # <class 'pandas._libs.tslibs.timedeltas.Timedelta'>
案例4: 演示 category类型
- 导包.
- 创建一个category类型的Series(s1).
- 查看s1.
- 打印s1的类型.
- 打印s1元素的元素.
# 1. 导包.
import pandas as pd
# 2. 创建一个category类型的Series(s1).
s1 = pd.Series(['男', '女', '保密'], dtype = 'category')
# 3. 查看s1.
s1
# 4. 打印s1的类型.
print(type(s1)) # <class 'pandas.core.series.Series'>
# 5. 打印s1元素的元素.
print(s1.dtypes) # category
结果图解
四, Pandas的基本操作
数据加载
数据加载的定义
概述
Pandas在使用中需要读取数据, 因此需要加载数据操作.
格式
DataFrame对象 = pd.read_文件格式(r'绝对路径', encoding = '文件对应编码表')
案例
案例需求
读取文件中的数据, 并进行查看.
实现思路
- 导包.
- 加载数据.
- 查看数据.
- 查看详细信息.
- 查看描述性统计信息.
# 1. 导包.
import pandas as pd
# 2. 加载数据.
df = = pd.read_文件格式(r'绝对路径', encoding = '文件对应编码表')
# 3. 查看数据.
df
# 4. 查看详细信息.
df.info()
# 5. 查看描述性统计信息.
df.describe()
索引操作
索引操作的定义
概述:
Pandas可以根据行列索引获取信息, 进行查看
格式:
# 格式1: 根据行列索引获取元素, (先列后行).
DataFrame对象['列名']['行索引']
# 格式2: 结合 loc 根据: 行索引 和 列名 来获取元素.
DataFrame对象.loc[行索引, 列名] # 获取单个元素
DataFrame对象.loc[起始行索引:结束行索引, [列名1, 列名2, ...]] # 获取多个元素
# 格式3: 结合 iloc 根据: 行号 和 列号 来获取元素
DataFrame对象.iloc[行号, 列号] # 获取单个元素
DataFrame对象.iloc[起始行号:结束行号, 起始列号:结束列号] # 获取多个元素
案例
案例需求
根据行列索引获取信息, 进行查看
实现思路
- 导包.
- 创建创建DataFrame对象(df).
- 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
- 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
- 格式1: 根据行列索引获取元素, (先列后行).
- DataFrame对象[‘列名’][‘行索引’]
- 尝试使用: 先行后列.
- 格式2: 结合 loc 根据: 行索引 和 列名 来获取元素.
- DataFrame对象.loc[行索引, 列名] # 获取单个元素.
- DataFrame对象.loc[起始行索引:结束行索引, [列名1, 列名2, …]] # 获取多个元素.
- 格式3: 结合 iloc 根据: 行号 和 列号 来获取元素
- DataFrame对象.iloc[行号, 列号] # 获取单个元素
- DataFrame对象.iloc[起始行号:结束行号, 起始列号:结束列号] # 获取多个元素
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 创建DataFrame对象(df).
# 3. 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
df = pd.DataFrame(np.random.randint(0, 31, (6, 5))) # 6列, 5行 包左不包右
# 4. 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.columns = ['G', 'H', 'I', 'J', 'K']
# 5. 格式1: 根据行列索引获取元素, (先列后行).
# 6. DataFrame对象['列名']['行索引']
df['G']['A'] # 20
# 7. 尝试使用: 先行后列.
# df['A']['G'] # 错误写法
# 8. 格式2: 结合 loc 根据: 行索引 和 列名 来获取元素.
# 9. DataFrame对象.loc[行索引, 列名] # 获取单个元素.
df.loc['A', 'G'] # 20
# 10. DataFrame对象.loc[起始行索引:结束行索引, [列名1, 列名2, ...]] # 获取多个元素
df.loc['A':'F', ['G', 'K']]
# 11. 格式3: 结合 iloc 根据: 行号 和 列号 来获取元素.
# 12. DataFrame对象.iloc[行号, 列号] # 获取单个元素.
df.iloc[0, 0] # 20
# 13. DataFrame对象.iloc[起始行号:结束行号, 起始列号:结束列号] # 获取多个元素
df.iloc[0:5, 0:4]
结果图解
赋值操作
赋值操作的定义
概述
Panads中可以通过赋值操作改变列的值
格式
格式1:
df['列名'] = 要新赋的值
格式2:
df.列名 = 要新赋的值
案例
案例需求
通过赋值操作改变列的值
实现思路
- 导包.
- 创建DataFrame对象(df).
- 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
- 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
- 查看数据.
- 赋值操作.
- 格式1: df[‘列名’] = 要新赋的值.
- 格式2: df.列名 = 要新赋的值.
- 查看结果.
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 创建DataFrame对象(df).
# 3. 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
df = pd.DataFrame(np.random.randint(0, 31, (6, 5))) # 6列, 5行 包左不包右
# 4. 修改DataFrame对象(df1)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.columns = ['G', 'H', 'I', 'J', 'K']
# 5. 查看数据.
df
# 6. 赋值操作.
# 7. 格式1: df['列名'] = 要新赋的值.
df['G'] = 23
# 8. 格式2: df.列名 = 要新赋的值.
df.K = 1
# 9. 查看结果.
df2 = df
df2
结果图解
排序操作
排序操作的定义
概述:
Pandas中排序有两种形式,一种对于索引进行排序,一种对于内容进行排序.
格式:
# 格式1: 基于1列的数据进行排序.
DataFrame对象.sort_values(by = '列名', ascending = True) # 升序(默认升序)
DataFrame对象.sort_values(by = '列名', ascending = False) # 降序
# 格式2: 基于列1的数据进行排序在列1的数据相同的情况下, 基于 列2的数据进行排序.
DataFrame对象.sort_values(by = ['列名1', '列名2', ...], ascending = [False, True, ...])
# 格式3: 基于索引进行排序.
DataFrame对象.sort_index(ascending = True) # 默认升序.
# 格式4: Series对象也有 sort_index(), sort_values() 排序方法.
DataFrame对象.列名.sort_index(ascending = True) # 索引升序 这里'DataFrame对象.列名'相当于'Series对象'
DataFrame对象.列名.sort_values(ascending = False) # 数据降序
案例
案例需求
对数据按照需求进行排列
实现思路
- 导包.
- 创建DataFrame对象(df).
- 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
- 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
- 基于G列做 升序, 降序 排列.
- 基于G列降序排列, G列的数据一样, 基于I列降序排列.
- 基于索引排序.
- Series对象也有 sort_index(), sort_values() 排序方法.
- 将G列基于索引升序排列.
10.将G列基于数据降序排列.
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 创建DataFrame对象(df).
# 3. 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
df = pd.DataFrame(np.random.randint(0, 31, (6, 5))) # 6列, 5行 包左不包右
# 4. 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.columns = ['G', 'H', 'I', 'J', 'K']
# 5. 基于G列做 升序, 降序 排列.
df.sort_values(by = 'G', ascending = True) # 升序
df.sort_values(by = 'G', ascending = False) # 降序
# 6. 基于G列降序排列, G列的数据一样, 基于I列降序排列.
df.sort_valies(by = ['G', 'I'], ascending = [False, False])
# 7. 基于索引排序.
df.sort_index(ascending = True) # 默认升序
# 8. Series对象也有 sort_index(), sort_values() 排序方法.
# 9. 将G列基于索引升序排列.
df.G.sort_index(ascending = True) # 索引升序 这里'DataFrame对象.列名'相当于'Series对象'
# 10.将G列基于数据降序排列.
df.G.sort_values(ascending = False) # 价格降序 这里'DataFrame对象.列名'相当于'Series对象'
结果图解
五, DataFrame的运算
算数运算
算术运算符
- 加: ‘+’
- 减: ‘-’
算术运算的格式
# 1. 加法运算 列值(数据) + n
# 格式1:
DataFrame对象.列名.add(n) # 这里'DataFrame对象.列名'相当于'Series对象'
# 格式2:
DataFrame对象.列名.add(n) # 这里'DataFrame对象.列名'相当于'Series对象'
# 2. 减法运算 列值 - n
# 格式1: 列值(的数据) - n
DataFrame对象.列名.sub(n) # 这里'DataFrame对象.列名'相当于'Series对象'
# 格式2:
DataFrame对象.列名 - n # 这里'DataFrame对象.列名'相当于'Series对象'
案例
案例需求
算数运算的演示
实现思路
- 导包.
- 创建DataFrame对象(df).
- 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
- 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
- G列名(的数据) + 3
- 格式1: DataFrame对象.列名.add(n) # 这里’DataFrame对象.列名’相当于’Series对象’
- 格式2: DataFrame对象.列名.add(n) # 这里’DataFrame对象.列名’相当于’Series对象’
- I列名(的数据) - 3
- 格式1:DataFrame对象.列名.sub(n) # 这里’DataFrame对象.列名’相当于’Series对象’
- 格式2: DataFrame对象.列名 - n # 这里’DataFrame对象.列名’相当于’Series对象’
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 创建DataFrame对象(df).
# 3. 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
df = pd.DataFrame(np.random.randint(0, 31, (6, 5))) # 6列, 5行 包左不包右
# 4. 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.columns = ['G', 'H', 'I', 'J', 'K']
# 5. G列名(的数据) + 3
# 6. 格式1: DataFrame对象.列名.add(n) # 这里'DataFrame对象.列名'相当于'Series对象'
df.G.add(3)
# 7. 格式2: DataFrame对象.列名 + n # 这里'DataFrame对象.列名'相当于'Series对象'
df.G + n
# 8. I列名(的数据) - 3
# 9. 格式1:DataFrame对象.列名.sub(n) # 这里'DataFrame对象.列名'相当于'Series对象'
df.G.sub(3)
# 10. 格式2: DataFrame对象.列名 - n # 这里'DataFrame对象.列名'相当于'Series对象'
df.G - 3
结果图解
逻辑运算
逻辑运算符
- 与: ‘&’
- 或: ‘|’
逻辑运算的格式
# 1. '与'逻辑运算, 筛选范围数据
# 格式1:
DataFrame对象[(DataFrame对象.列名 > n1) & (DataFrame对象.列名 < n2)] # 细节: 多组判断记得加 小括号.
# 格式2:
DataFrame对象[(DataFrame对象['列名'] > n1) & (DataFrame对象['列名'] < n2)] # 标准写法.
# 格式3: 使用query()函数.
DataFrame对象.query('列名 > n1 & 列名 < n2') # query()函数优化写法
# 2. '或'逻辑运算, 筛选固定数据
# 格式1:
DataFrame对象[(DataFrame对象.列名 == n1) | (DataFrame对象.列名 == n2)]
# 格式2: 使用isin()函数.
DataFrame对象[DataFrame对象.列名.isin([n1,n2])]
案例
案例需求
演示逻辑运算
实现思路
- 导包.
- 创建DataFrame对象(df).
- 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
- 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
- 完成需求.
- 需求1: 筛选出 G列中 大于 5 的数据.
- 需求2: 筛选出 G列中 大于 5 , 且 小于 20 的数据.
- 格式1:
- DataFrame对象[(DataFrame对象.列名 > n1) & (DataFrame对象.列名 < n2)] # 细节: 多组判断记得加 小括号.
- 格式2:
- DataFrame对象[(DataFrame对象[‘列名’] > n1) & (DataFrame对象[‘列名’] < n2)] # 标准写法.
- 格式3: 使用 query() 函数
- DataFrame对象.query(‘列名 > n1 & 列名 < n2’) # query()函数优化写法
- 需求3: 查询 G的数据为 的一行的所有数据.
- 格式1:
- DataFrame对象[(DataFrame对象.G == n1| (DataFrame对象.G == n2)]
- 格式2: 使用 isin() 函数
- DataFrame对象[DataFrame对象.G,isin([, ])]
- 格式3:
- DataFrame对象.query(‘列名 == n1 | 列名 == n2’)
- 格式4:
- DataFrame对象.query(‘G in [n1, n2]’)
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 创建DataFrame对象(df).
# 3. 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
df = pd.DataFrame(np.random.randint(0, 31, (6, 5))) # 6列, 5行 包左不包右
# 4. 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.columns = ['G', 'H', 'I', 'J', 'K']
# 5. 完成需求.
# 6. 需求1: 筛选出 G列中 大于 5 的数据.
df[df.G > 5]
# 7. 需求2: 筛选出 G列中 大于 5 , 且 小于 20 的数据.
# 8. 格式1:
# 9. DataFrame对象[(DataFrame对象.列名 > n1) & (DataFrame对象.列名 < n2)] # 细节: 多组判断记得加 小括号.
df[(df.G > 5) & (df.G < 20)]
# 10. 格式2:
# 11. DataFrame对象[(DataFrame对象['列名'] > n1) & (DataFrame对象['列名'] < n2)] # 标准写法.
df[(df['G'] > 5) & (df['G'] < 20)]
# 12. 格式3: 使用 query() 函数.
# 13. DataFrame对象.query('列名 > n1 & 列名 < n2') # query()函数优化写法
df.query('G > 5 & G < 20')
# 14. 需求3: 查询 G的数据为 的一行的所有数据.
# 15. 格式1:
# 16. DataFrame对象[(DataFrame对象.G == n1| (DataFrame对象.G == n2)]
df[(df.G == 24| df.G == 25)]
# 17. 格式2: 使用 isin() 函数
# 18. DataFrame对象[DataFrame对象.G.isin([n1, n2])]
df[df.G.isin([24, 25])]
# 19. 格式3:
# 20. DataFrame对象.query('列名 == n1 | 列名 == n2')
df.query('G ==24 | G == 25')
# 21. 格式4:
# 22. DataFrame对象.query('G in [n1, n2]')
df.query('G in [24, 25]')
结果图解
统计运算
统计函数
统计函数及其操作
编号 | 函数 | 作用 |
---|---|---|
1 | describe() | 查看各列的描述性的 统计信息(个数, 最大值, 最小值, 平均值, 中位数, 25%分位数, 75%分位数). |
2 | count() | 用于求非空 (或非NaN) 元素的数量. (axis = 0时, 针对列计算, axis = 1时, 针对行计算)(默认axis = 0) |
3 | sum() | 用于求和 |
4 | mean() | 用于求平均值 |
5 | median() | 用于求中位数. |
6 | min() | 用于求最小值. |
7 | max() | 用于求最大值 |
8 | mode() | 用于求众数 |
9 | abs() | 用于求绝对值 |
10 | prod() | 用于求乘积 |
11 | std() | 用于求标准差 |
12 | var() | 用于求均方差 |
13 | idxmax() | 用于返回最大值的行索引 |
14 | idxmin() | 用于返回最小值的行索引 |
案例
案例需求
演示统计函数及其操作
实现思路
- 导包.
- 创建DataFrame对象(df).
- 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
- 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
- 完成需求.
- 需求1:查看描述性统计信息.
- 需求2: 分别求出A行和I列的元素的数量
- 需求3: 对所有列求和.
- 需求4:对所有列求平均值
- 需求5: 对J列求平均值.
- 需求6: 对所有列求中位数.
- 需求7: 对所有列求最小值.
- 需求8: 对所有列求最大值.
- 需求9: 对所有列求众数
- 需求10: 对G列求绝对值.
- 需求11: 求所有列的所有数据的乘积.
- 需求12: 对所有列求标准差.
- 需求13: 对所有列求方差.
- 需求14: 返回所有列的最大值的行索引.
- 需求15: 返回所有行的最大值的列索引.
- 需求16: 返回所有列的最小值的行索引.
- 需求17: 返回所有行的最小值的列索引.
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 创建DataFrame对象(df).
# 3. 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
df = pd.DataFrame(np.random.randint(0, 31, (6, 5))) # 6列, 5行 包左不包右
# 4. 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.columns = ['G', 'H', 'I', 'J', 'K']
# 5. 完成需求.
# 6. 需求1:查看描述性统计信息.
df.describe()
# 7. 需求2: 分别求出所有行和所有列的元素的数量
df.A.count(axis = 1)
af.I.count()
# 8. 需求3: 对所有列求和.
df.sum()
# 9. 需求4:对所有列求平均值.
df.mean()
# 10. 需求5: 对J列求平均值.
df.J.mean() # 9.166666666666666
# 11. 需求6: 对所有列求中位数.
df.median()
# 12. 需求7: 对所有列求最小值.
df.min()
# 13. 需求8: 对所有列求最大值.
df.max()
# 14. 需求9: 对所有列求众数.
df.mode()
# 15. 需求10: 对G列求绝对值.
df.G.abs()
# 16. 需求11: 求所有列的所有数据的乘积.
df.prod()
# 17. 需求12: 对所有列求标准差.
df.std()
# 18. 需求13: 对所有列求方差.
df.var()
# 19. 需求14: 返回所有列的最大值的行索引.
df.idxmax()
# 20. 需求16: 返回所有列的最小值的行索引.
df.idxmin()
结果图解
累计统计函数
累计统计函数及其操作
编号 | 函数 | 作用 |
---|---|---|
1 | cumsum() | 计算前1/2/3/…/n个数的和 |
2 | cummax() | 计算前1/2/3/…/n个数的最大值 |
3 | cummin() | 计算前1/2/3/…/n个数的最小值 |
4 | cumprod() | 计算前1/2/3/…/n个数的积 |
案例
案例需求
演示统计函数及其操作
实现思路
- 导包.
- 创建DataFrame对象(df).
- 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
- 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
- 完成需求.
- 需求1: 对所有列的数据进行累加操作.
- 需求2: 对G列的数据进行取最大值操作.
- 需求3: 对所有列的数据进行取最小值操作.
- 需求4: 对I列的数据进行累乘操作.
# 1. 导包
import pandas as pa
import nimpu as np
# 2. 创建DataFrame对象(df).
# 3. 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
df = pd.DataFrame(np.random.randint(0, 31, (6, 5))) # 6列, 5行 包左不包右
# 4. 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.columns = ['G', 'H', 'I', 'J', 'K']
# 5. 完成需求.
# 6. 需求1: 对所有列的数据进行累加操作.
df.cumsum()
# 7. 需求2: 对G列的数据进行取最大值操作.
df.G.cummax()
# 8. 需求3: 对所有列的数据进行取最小值操作.
df.cummin()
# 9. 需求4: 对I列的数据进行累乘操作.
df.I.cumprod()
结果图解
apply()函数自定义运算
apply()函数的定义
背景:
上述的函数都是Pandas定义好逻辑的, 有时需要传入一些自定义的逻辑,就需要用到 apply()函数了.
概述:
apply()函数可以自定义逻辑
格式:
# 格式:
df.apply(func, axis = 0)
(1) func: 自定义函数
(2) axis: axis = 0 默认为列进行计算; axis = 1 为行进行计算.
案例
案例需求
同时获取到 多列的 最大值 和 最小值 的差值.
实现思路
- 导包.
- 创建DataFrame对象(df).
- 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
- 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
- 思路1: 分解版.
- 自定义函数 my_func, 接收 某列的数据, 计算该列的最大值和最小值, 返回差值.
- 获取到 H列 和 I列.
- 方法1:
- 方法2:
- 方法3:
- 方法4:
- 通过apply()函数, 调用上述的自定义函数, 作用到 指定的列.
- 思路2: 合并版, 通过 lambda函数实现.
# 1. 导包.
import pandas as pd
import numpy as np
# 2. 创建DataFrame对象(df).
# 3. 准备数据集(随机生成30个在0 ~ 30之间的数, 维度为(6, 5)6行5列).
df = pd.DataFrame(np.random.randint(0, 31, (6, 5))) # 6列, 5行 包左不包右
# 4. 修改DataFrame对象(df)的 列名 和 索引数值.索引为: A-F, 列为: G-K.
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.columns = ['G', 'H', 'I', 'J', 'K']
# 5. 思路1: 分解版.
# 6. 自定义函数 my_func, 接收 某列的数据, 计算该列的最大值和最小值, 返回差值.
def my_func(col):
return col.max() - col.min()
# 7. 获取到 H列 和 I列.
# 8. 方法1:
df[['H', 'I']]
# 9. 方法2:
df.loc[:, ['H', 'I']]
# 10. 方法3:
df.iloc[:, [1, 2]]
# 11. 方法4:
df.iloc[:, 1:3:1]
# 12. 通过apply()函数, 调用上述的自定义函数, 作用到 指定的列.
df[['H', 'I']].apply(my_func, axis = 1) # axis = 1, 表示对 行 进行操作.
df[['H', 'I']].apply(my_func, axis = 0) # axis = 0, 表示对 列 进行操作.
df[['H', 'I']].apply(my_func) # 效果同上, 默认是axis = 0, 底层 -> 把df的各列分别传入函数, 计算结果.
# 13. 思路2: 合并版, 通过 lambda 函数实现.
df[['H', 'I']].apply(lambda col: col.max() - col.min())
结果图解
六, 总结
- Q1:Pandas中的两大核心对象?
- 分别是: DataFrame和Series
- Series -> 单列数据
- DataFrame -> 多列数据
- 分别是: DataFrame和Series
- Q2: Series对象的定义?
- Series是一种类似于一维数组的对象,由下面两个部分组成:
- values:一组数据(numpy.ndarray类型).
- index:相关的数据索引标签.如果没有为数据指定索引,会自动创建一个0到N-1(N为数据的长度)的整数型索引.
- Series是一种类似于一维数组的对象,由下面两个部分组成:
- Q3: DataFrame对象的定义?
- DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引.
- 行索引,表明不同行,横向索引,叫index,0轴,axis=0
- 列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
- DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引.
- Q4: FataFrame对象的基本函数?
- head(n): 查看前n行的数据(默认是5行)
- tail(n): 查看后5行的数据(默认是5行)
- info(): 查看df对象的详细信息
- describe(): 查看df对象的 描述性 统计信息
- reset_index(drop = True): 重置索引
- set_index(): 重新设置索引
- Q5: Pandas的数据类型?
- object:字符串类型
- int: 整数类型
- float: 浮点数类型
- datetime: 日期时间类型
- timedelta: 时间差类型
- category: 分类类型
- bool: 布尔类型
- nan: 空值类型
- Q6: Pandas的基本操作?
- 数据加载
- 索引操作
- 赋值操作
- 排序操作
- Q7: DataFrame的运算?
- 算数运算
- 逻辑运算
- 统计运算
- apply()函数自定义运算