1、学习目标
-
知道Pandas的作用
-
能够搭建使用Pandas的开发环境
Pandas介绍
Python在数据处理上独步天下:代码灵活、开发快速;尤其是Python的Pandas包,无论是在数据分析领域、还是大数据开发场景中都具有显著的优势:
-
Pandas是Python的一个第三方包,也是商业和工程领域最流行的结构化数据工具集,用于数据清洗、处理以及分析
-
Pandas在数据处理上具有独特的优势:
-
底层是基于Numpy构建的,所以运行速度特别的快
-
有专门的处理缺失数据的API
-
强大而灵活的分组、聚合、转换功能
-
适用场景:
-
数据量大到Excel严重卡顿,且又都是单机数据的时候,我们使用Pandas
-
Pandas用于处理单机数据(小数据集(相对于大数据来说))
-
-
在大数据ETL数据仓库中,对数据进行清洗及处理的环节使用Pandas
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pandas
注意:Anaconda默认已经安装了Pandas以及Numpy等内容
Pandas初体验
-
1- 将资料中提供的数据集导入到data目录中
-
2- 创建python脚本, 导入pandas库
import pandas as pd
-
3- 基于pandas加载数据
df = pd.read_csv('./1960-2019全球GDP数据.csv', encoding='gbk')
# 设置显示的最大行数和列数为None
pd.set_option('display.max_rows', None) pd.set_option('display.max_columns', None)
# 恢复显示的最大行数到默认值
pd.reset_option('display.max_rows') # 恢复显示的最大列数到默认值 pd.reset_option('display.max_columns')
# 恢复所有选项到默认值 pd.reset_option('all')
-
4- 基于pandas完成相关查询:
# 查询中国的GDP china_gdp = df[df.country=='中国'] # df.country 选中名为country的列 china_gdp.head(10) # 显示前10条数据
运行结果:
5- 查询中国GDP
china_gdp = df[df.country=='中国'] # df.country 选中名为country的列
china_gdp.head(10) # 显示前10条数据
6- 将year年份设置为索引
china_gdp = china_gdp.set_index('year')
china_gdp.head() # 默认显示前5条
7- 画出GDP逐年变化的曲线图
china_gdp.GDP.plot()
使用同样的方法画出日本的GDP变化曲线,和中国的GDP变化曲线进行对比
jp_gdp = df[df.country=='日本'].set_index('year') # 按条件选取数据后,重设索引
jp_gdp.GDP.plot()
china_gdp.GDP.plot()
分别查询中国、美国、日本三国的GDP数据,并绘制GDP变化曲线、进行对比
china_gdp = df[df.country=='中国'].set_index('year')
us_gdp = df[df.country=='美国'].set_index('year')
jp_gdp = df[df.country=='日本'].set_index('year')
jp_gdp.GDP.plot()
china_gdp.GDP.plot()
us_gdp.GDP.plot()
设置图例:
# 按条件选取数据
china_gdp = df[df.country=='中国'].set_index('year')
us_gdp = df[df.country=='美国'].set_index('year')
jp_gdp = df[df.country=='日本'].set_index('year')
# 出图并添加图例
jp_gdp.GDP.plot(legend=True)
china_gdp.GDP.plot(legend=True)
us_gdp.GDP.plot(legend=True)
修改列名使图例显示为各国名称
# 按条件选取数据
china_gdp = df[df.country=='中国'].set_index('year')
us_gdp = df[df.country=='美国'].set_index('year')
jp_gdp = df[df.country=='日本'].set_index('year')
# 对指定的列修改列名
jp_gdp.rename(columns={'GDP':'japan'}, inplace=True)
china_gdp.rename(columns={'GDP':'china'}, inplace=True)
us_gdp.rename(columns={'GDP':'usa'}, inplace=True)
# 画图
jp_gdp.japan.plot(legend=True)
china_gdp.china.plot(legend=True)
us_gdp.usa.plot(legend=True)
8- 解决中文不能在图表中正常显示的问题
将列名改为中文,使图例显示为各国名称
# 按条件选取数据
china_gdp = df[df.country=='中国'].set_index('year')
us_gdp = df[df.country=='美国'].set_index('year')
jp_gdp = df[df.country=='日本'].set_index('year')
# 对指定的列修改列名
jp_gdp.rename(columns={'GDP':'日本'}, inplace=True)
china_gdp.rename(columns={'GDP':'中国'}, inplace=True)
us_gdp.rename(columns={'GDP':'美国'}, inplace=True)
# 画图
jp_gdp['日本'].plot(legend=True)
china_gdp['中国'].plot(legend=True)
us_gdp['美国'].plot(legend=True)
# 解决中文显示问题,下面的代码只需运行一次即可
import matplotlib as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
运行结果:
小结
Python Pandas的作用:(清洗、处理、分析数据)
Pandas环境搭建:
-
安装Anaconda,默认自带Python以及其他相关三方包
-
使用默认的base虚拟环境启动
JupyterNotebook
二、Pandas数据结构与数据类型
学习目标
-
知道什么是DataFrame对象、什么是Seires对象
-
对Series和DataFrame的常用API有印象、能找到、能看懂
-
了解Pandas中常用数据类型
-
知道Series以及DataFrame的运算规则
-
知道numpy.where()函数的用法
Pandas数据结构和数据类型
上图为上一节中读取并展示出来的数据,以此为例我们来讲解Pandas的核心概念,以及这些概念的层级关系:
-
DataFrame
-
Series
-
索引列
-
索引名、索引值
-
索引下标、行号
-
-
数据列
-
列名
-
列值,具体的数据
-
-
-
其中最核心的就是Pandas中的两个数据结构:DataFrame和Series
Series对象
Series也是Pandas中的最基本的数据结构对象,下文中简称s对象;是DataFrame的列对象,series本身也具有索引。
Series是一种类似于一维数组的对象,由下面两个部分组成:
-
values:一组数据(numpy.ndarray类型)
-
index:相关的数据索引标签;如果没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。
创建Series对象
-
1- 导入pandas
import pandas as pd
-
2- 通过list列表来创建
# 使用默认自增索引
s2 = pd.Series([1, 2, 3])
print(s2)
# 自定义索引
s3 = pd.Series([1, 2, 3], index=['A', 'B', 'C'])
s3
结果为:
0 1
1 2
2 3
dtype: int64
A 1
B 2
C 3
dtype: int64
3- 使用字典或元组创建series对象
#使用元组
tst = (1,2,3,4,5,6)
pd.Series(tst)
#使用字典:
dst = {'A':1,'B':2,'C':3,'D':4,'E':5,'F':6}
pd.Series(dst)
4- 使用numpy创建series对象
pd.Series(np.arange(10))
# 运行结果
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int64
Series对象属性
构造一个series对象
s4 = pd.Series([i for i in range(6)], index=[i for i in 'ABCDEF'])
s4
# 返回结果如下
A 0
B 1
C 2
D 3
E 4
F 5
dtype: int64
1- series对象常用属性
s4.index
2- values
s4.values
3- 也可以通过索引来获取数据
s4['A']
DataFrame
创建DataFrame对象
DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引
-
行索引,表明不同行,横向索引,叫index,0轴,axis=0
-
列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
DataFrame的创建有很多种方式
读取文件数据返回df:在之前的学习中我们使用了pd.read_csv('csv格式数据文件路径')
的方式获取了df对象
使用字典、列表、元组创建df:接下来就展示如何使用字典、列表+元组、numpy创建df对象
-
1- 使用字典加列表创建df,使默认自增索引
df1_data = {
'日期': ['2021-08-21', '2021-08-22', '2021-08-23'],
'温度': [25, 26, 50],
'湿度': [81, 50, 56]
}
df1 = pd.DataFrame(data=df1_data)
df1
# 返回结果如下
日期 温度 湿度
0 2021-08-21 25 81
1 2021-08-22 26 50
2 2021-08-23 50 56
2- 使用列表加元组创建df,并自定义索引
df2_data = [
('2021-08-21', 25, 81),
('2021-08-22', 26, 50),
('2021-08-23', 27, 56)
]
df2 = pd.DataFrame(
data=df2_data,
columns=['日期', '温度', '湿度'],
index = ['row_1','row_2','row_3'] # 手动指定索引
)
df2
# 返回结果如下
日期 温度 湿度
row_1 2021-08-21 25 81
row_2 2021-08-22 26 50
row_3 2021-08-23 27 56
-
3- 使用numpy创建df
通过已有数据创建
pd.DataFrame(np.random.randn(2,3)) # 2行3列
创建学生成绩表
# 生成10名同学,5门功课的数据
score = np.random.randint(40, 100, (10, 5))
# 结果
array([[92, 55, 78, 50, 50],
[71, 76, 50, 48, 96],
[45, 84, 78, 51, 68],
[81, 91, 56, 54, 76],
[86, 66, 77, 67, 95],
[46, 86, 56, 61, 99],
[46, 95, 44, 46, 56],
[80, 50, 45, 65, 57],
[41, 93, 90, 41, 97],
[65, 83, 57, 57, 40]])
但是这样的数据形式很难看到存储的是什么的样的数据,可读性比较差!
问题:如何让数据更有意义的显示?
# 使用Pandas中的数据结构
score_df = pd.DataFrame(score)
给分数数据增加行列索引,显示效果更佳
效果:
增加行、列索引
# 构造行索引序列
subjects = ["语文", "数学", "英语", "政治", "体育"]
# 构造列索引序列
stu = ['同学' + str(i) for i in range(score_df.shape[0])]
# 添加行索引
data = pd.DataFrame(score, columns=subjects, index=stu)
DataFrame对象属性
属性
-
1- shape属性
data.shape
# 结果
(10, 5)
-
2- index属性
DataFrame的行索引列表
data.index
# 结果
Index(['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9'], dtype='object')
3- columns
data.columns
# 结果
Index(['语文', '数学', '英语', '政治', '体育'], dtype='object')
-
4- values
直接获取其中array的值
data.values
array([[92, 55, 78, 50, 50],
[71, 76, 50, 48, 96],
[45, 84, 78, 51, 68],
[81, 91, 56, 54, 76],
[86, 66, 77, 67, 95],
[46, 86, 56, 61, 99],
[46, 95, 44, 46, 56],
[80, 50, 45, 65, 57],
[41, 93, 90, 41, 97],
[65, 83, 57, 57, 40]])
-
5- T
转置
data.T
结果
DataFrame对象方法
1- head(n)
显示前n行内容
data.head(5)
2- tail(n)
显示后n行内容
如果不补充参数,默认5行。填入参数n则显示后n行
data.tail(5)
DatatFrame索引的设置
需求:
-
1- 修改行列索引值
stu = ["学生_" + str(i) for i in range(score_df.shape[0])] # 必须整体全部修改 data.index = stu
注意:以下修改方式是错误的
# 错误修改方式 data.index[3] = '学生_3'
-
2- 重设索引
-
reset_index(drop=False)
-
设置新的下标索引
-
drop:默认为False,不删除原来索引,如果为True,删除原来的索引值
-
-
# 重置索引,drop=False data.reset_index()
-
3- 以某列值设置为新的索引
-
set_index(keys, drop=True)
-
keys : 列索引名成或者列索引名称的列表
-
drop : boolean, default True.当做新的索引,删除原来的列
-
-
设置新索引案例
第一步:创建
df = pd.DataFrame({'month': [1, 4, 7, 10], 'year': [2012, 2014, 2013, 2014], 'sale':[55, 40, 84, 31]}) month sale year 0 1 55 2012 1 4 40 2014 2 7 84 2013 3 10 31 2014
第二步:以月份设置新的索引
df.set_index('month') sale year month 1 55 2012 4 40 2014 7 84 2013 10 31 2014
第三步:设置多个索引,以年和月份
df = df.set_index(['year', 'month']) df sale year month 2012 1 55 2014 4 40 2013 7 84 2014 10 31
Pandas的数据类型
df或s对象中具体每一个值的数据类型有很多,如下表所示
Pandas数据类型 | 说明 | 对应的Python类型 |
---|---|---|
Object | 字符串类型 | string |
int | 整数类型 | int |
float | 浮点数类型 | float |
datetime | 日期时间类型 | datetime包中的datetime类型 |
timedelta | 时间差类型 | datetime包中的timedelta类型 |
category | 分类类型 | 无原生类型,可以自定义 |
bool | 布尔类型 | bool(True,False) |
nan | 空值类型 | None |
-
可以通过下列API查看s对象或df对象中数据的类型
s1.dtypes df1.dtypes df1.info() # s对象没有info()方法
-
几个特殊类型演示
-
datetime类型
import pandas as pd # 创建一个datetime类型的Series dates = pd.to_datetime(['2024-09-01', '2024-09-02', '2024-09-03']) print(dates)
-
timedelta类型
import pandas as pd # 计算两个日期之间的差值 start_date = pd.to_datetime('2024-09-01') end_date = pd.to_datetime('2024-09-05') delta = end_date - start_date print(delta)
-
category类型
类型用于表示分类数据,通常用于有限集合中的数据类型,例如性别、颜色、产品类型等。这种类型的优点在于占用更少的内存,并且对分类数据的操作更快。
import pandas as pd # 创建一个category类型的Series categories = pd.Series(['apple', 'banana', 'apple', 'orange'], dtype='category') print(categories)
-
小结
-
series【知道】
-
创建
-
pd.Series([], index=[])
-
pd.Series({})
-
-
属性
-
对象.index
-
对象.values
-
-
-
DataFrame【掌握】
-
创建
-
pd.DataFrame(data=None, index=None, columns=None)
-
-
属性
-
shape -- 形状
-
index -- 行索引
-
columns -- 列索引
-
values -- 查看值
-
T -- 转置
-
head() -- 查看头部内容
-
tail() -- 查看尾部内容
-
-
DataFrame索引
-
修改的时候,需要进行全局修改
-
对象.reset_index()
-
对象.set_index(keys)
-
-