Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。Pandas 已经成为 Python 数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具。
Pandas 这个名字来源于面板数据(Panel Data)与数据分析(data analysis)这两个名词的组合。在经济学中,Panel Data 是一个关于多维数据集的术语。Pandas 最初被应用于金融量化交易领域,现在它的应用领域更加广泛,涵盖了农业、工业、交通等许多行业。
Pandas 最初由 Wes McKinney(韦斯·麦金尼)于 2008 年开发,并于 2009 年实现开源。目前,Pandas 由 PyData 团队进行日常的开发和维护工作。在 2020 年 12 月,PyData 团队公布了最新的 Pandas 1.20 版本 。
在 Pandas 没有出现之前,Python 在数据分析任务中主要承担着数据采集和数据预处理的工作,但是这对数据分析的支持十分有限,并不能突出 Python 简单、易上手的特点。Pandas 的出现使得 Python 做数据分析的能力得到了大幅度提升,它主要实现了数据分析的五个重要环节:
加载数据 整理数据 操作数据 构建数据模型 分析数据
Pandas 主要特点
和其它语言的数据分析包相比,Pandas 优势
Pandas 安装
Python 官方标准发行版并没有自带 Pandas 库,因此需要另行安装。除了标准发行版外,还有一些第三方机构发布的 Python 免费发行版, 它们在官方版本的基础上开发而来,并有针对性的提前安装了一些 Python 模块,从而满足某些特定领域的需求,比如专门适应于科学计算领域的 Anaconda,它就提前安装了多款适用于科学计算的软件包。
pip install pandas
我们知道,构建和处理二维、多维数组是一项繁琐的任务。Pandas 为解决这一问题, 在 ndarray 数组(NumPy 中的数组)的基础上构建出了两种不同的数据结构,分别是 Series(一维数据结构)DataFrame(二维数据结构):
Series 是带标签的一维数组,这里的标签可以理解为索引,但这个索引并不局限于整数,它也可以是字符类型,比如 a、b、c 等;
DataFrame 是一种表格型数据结构,它既有行标签,又有列标签。
数据结构做简单地的说明:
由于上述数据结构的存在,使得处理多维数组数任务变的简单。在《Pandas Series入门教程》和《Pandas DataFrame入门教程(图解)》两节中,我们会对上述数据结构做详细讲解。
Pandas 内置数据结构 教程
Pandas Series:《Pandas Series入门教程》
DataFrame:《Pandas DataFrame入门教程(图解)》
Series 结构,也称 Series 序列,是 Pandas 常用的数据结构之一,它是一种类似于一维数组的结构,由一组数据值(value)和一组标签组成,其中标签与数据值之间是一一对应的关系。
Series 可以保存任何数据类型,比如整数、字符串、浮点数、Python 对象等,它的标签默认为整数,从 0 开始依次递增。Series 的结构图,如下所示:
最左边的列,通过标签我们可以更加直观地查看数据所在的索引位置。
创建 Series 对象
首先介绍 Series 对象的属性:
Pandas 使用 Series() 函数来创建 Series 对象,通过这个对象可以调用相应的方法和属性,从而达到处理数据的目的:
import pandas as pd
s = pd.Series(data, index, dtype, copy)
相关参数说明:
ndarray 是 NumPy 中的数组类型,当 data 是 ndarry 时,传递的索引必须具有与数组相同的长度。假如没有给 index 参数传参,在默认情况下,索引值将使用是 range(n) 生成,其中 n 代表数组长度。
使用默认索引,创建 Series 序列对象:
import pandas as pd
import numpy as np
data = np.array(['a', 'b', 'c', 'd'])
s = pd.Series(data)
print(s)
dict 创建 Series 对象
可以把 dict 作为输入数据。如果没有传入索引时会按照字典的键来构造索引。反之,当传递了索引时需要将索引标签与字典中的值对应。
import pandas as pd
data = {'a': 0., 'b': 1., 'c': 2.}
s = pd.Series(data)
print(s)
index 参数传递索引时
import pandas as pd
data = {'a': 0., 'b': 1., 'c': 2.}
s = pd.Series(data, index=['b', 'c', 'd', 'a'])
print(s)
标量创建 Series 对象
如果 data 是标量值,则必须提供索引,示例如下:
import pandas as pd
s = pd.Series(5, index=[0, 1, 2, 3])
print(s)
上述讲解了创建 Series 对象的多种方式,那么我们应该如何访问 Series 序列中元素呢?分为两种方式,一种是位置索引访问,另一种是索引标签访问。
位置索引访问
这种访问方式与 ndarray 和 list 相同,使用元素自身的下标进行访问。我们知道数组的索引计数从 0 开始,这表示第一个元素存储在第 0 个索引位置上,以此类推,就可以获得 Series 序列中的每个元素。下面看一组简单的示例:
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print(s[0]) # 位置下标
print(s['a']) # 标签下标
通过切片的方式访问 Series 序列中的数据,示例如下:
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print(s[:3])
索引标签访问
Series 类似于固定大小的 dict,把 index 中的索引标签当做 key,而把 Series 序列中的元素值当做 value,然后通过 index 索引标签来访问或者修改元素值。
import pandas as pd
s = pd.Series([6, 7, 8, 9, 10], index=['a', 'b', 'c', 'd', 'e'])
print(s['a'])
使用索引标签访问多个元素值
import pandas as pd
s = pd.Series([6, 7, 8, 9, 10], index=['a', 'b', 'c', 'd', 'e'])
print(s[['a', 'c', 'd']])
DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。其结构图示意图,如下所示:
表格中展示了某个销售团队个人信息和绩效评级(rating)的相关数据。数据以行和列形式来表示,其中每一列表示一个属性,而每一行表示一个条目的信息。
创建 DataFrame 对象的语法格式如下:
import pandas as pd
pd.DataFrame( data, index, columns, dtype, copy)
相关参数说明:
使用下列方式创建一个空的 DataFrame,这是 DataFrame 最基本的创建方法。
import pandas as pd
df = pd.DataFrame()
print(df)
列表创建 DataFame 对象
可以使用单一列表或嵌套列表来创建一个 DataFrame。
import pandas as pd
data = [1, 2, 3, 4, 5]
df = pd.DataFrame(data)
print(df)
字典嵌套列表创建 DataFame 对象
data 字典中,键对应的值的元素长度必须相同(也就是列表长度相同)。如果传递了索引,那么索引的长度应该等于数组的长度;如果没有传递索引,那么默认情况下,索引将是 range(n),其中 n 代表数组长度。
import pandas as pd
data = {'Name': ['Tom', 'Jack', 'Steve', 'Ricky'], 'Age': [28, 34, 29, 42]}
df = pd.DataFrame(data)
print(df)
Series 创建 DataFrame 对象
可以传递一个字典形式的 Series,从而创建一个 DataFrame 对象,其输出结果的行索引是所有 index 的合集。
import pandas as pd
d = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df)
DataFrame 的属性和方法,与 Series 相差无几,如下所示:
DataFrame 可以使用列索(columns index)引来完成数据的选取、添加和删除操作。下面依次对这些操作进行介绍。
列索引选取数据列
您可以使用列索引,轻松实现数据选取,示例如下:
import pandas as pd
d = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df['one'])
列索引添加数据列
使用 columns 列索引表标签可以实现添加新的数据列,示例如下:
import pandas as pd
d = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
# 使用df['列']=值,插入新的数据列
df['three'] = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(df)
# 将已经存在的数据列做相加运算
df['four'] = df['one'] + df['three']
print(df)
列索引删除数据列
通过 del 和 pop() 都能够删除 DataFrame 中的数据列。示例如下:
import pandas as pd
d = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
'three': pd.Series([10, 20, 30], index=['a', 'b', 'c'])}
df = pd.DataFrame(d)
print("Our dataframe is:")
print(df)
# 使用del删除
del df['one']
print(df)
# 使用pop方法删除
df.pop('two')
print(df)
理解了上述的列索引操作后,行索引操作就变的简单。下面看一下,如何使用行索引来选取 DataFrame 中的数据。
标签索引选取
可以将行标签传递给 loc 函数,来选取数据。示例如下:
import pandas as pd
d = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df.loc['b'])
注意:loc 允许接两个参数分别是行和列,参数之间需要使用“逗号”隔开,但该函数只能接收标签索引。
整数索引选取
通过将数据行所在的索引位置传递给 iloc 函数,也可以实现数据行选取。示例如下:
import pandas as pd
d = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df.iloc[2])
切片操作多行选取
您也可以使用切片的方式同时选取多行。示例如下:
import pandas as pd
d = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
# 左闭右开
print(df[2:4])
添加数据行
使用 append() 函数,可以将新的数据行添加到 DataFrame 中,该函数会在行末追加数据行。示例如下:
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns=['a', 'b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=['a', 'b'])
# 在行末追加新数据行
df = df.append(df2)
print(df)
删除数据行
您可以使用行索引标签,从 DataFrame 中删除某一行数据。如果索引标签存在重复,那么它们将被一起删除。示例如下:
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns=['a', 'b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=['a', 'b'])
df = df.append(df2)
print(df)
# 注意此处调用了drop()方法
df = df.drop(0)
print(df)
常用属性和方法汇总
DataFrame 的属性和方法,与 Series 相差无几,如下所示:
import pandas as pd
import numpy as np
# 创建字典型series结构
d = {'Name': pd.Series(['小明', '小亮', '小红', '小华', '老赵', '小曹', '小陈', '老李', '老王', '小冯', '小何', '老张']),
'Age': pd.Series([25, 26, 25, 23, 30, 29, 23, 34, 40, 30, 51, 46]),
'Rating': pd.Series([4.23, 3.24, 3.98, 2.56, 3.20, 4.6, 3.8, 3.78, 2.98, 4.80, 4.10, 3.65])}
df = pd.DataFrame(d)
sum() 求和
在默认情况下,df.sum()
返回 axis=0 的所有值的和。
注意:sum() 和 cumsum() 函数可以同时处理数字和字符串数据。虽然字符聚合通常不被使用,但使用这两个函数并不会抛出异常;而对于 abs()、cumprod() 函数则会抛出异常,因为它们无法操作字符串数据。
mean() 求均值
df = pd.DataFrame(d)
df.mean() # mean()求均值
std() 求标准差
df = pd.DataFrame(d)
df.std() # 返回数值列的标准差
describe() 描述性汇总
df = pd.DataFrame(d)
df.std() # 返回数值列的标准差
describe() 函数输出了平均值、std 和 IQR 值(四分位距)等一系列统计信息。通过 describe() 提供的include能够筛选字符列或者数字列的摘要信息。
常见问题
module ‘backend_interagg’ has no attribute ‘FigureCanvas’
经检查,报错原因是因为matplotlib版本过高的问题,需要降低matplotlib版本。
解决办法如下:
pip uninstall matplotlib
pip install matplotlib==3.5.3
常见问题
问题:pycharm中 python 的库 pandas 的对象 DataFrame 的 plot() 方法不显示图片
解决:导入matplotlib.pyplot并show()
import pandas as pd
import matplotlib.pyplot as mpl_pp
data = pd.read_csv('D:\pima.data')
data6 = data['6'].value_counts().sort_values(ascending = True)
data6.plot(kind = 'bar')
mpl_pp.show()
常见问题
Spyder “Glyph 24066 missing from current font.“报错问题
在使用spyder完成Matplotlib模块实现数据可视化时出现 Glyph *** missing from current font。错误问题,经查阅资料综合网上给出的解决方案,总结如下:
问题原因:matplotlib自带的字体库不支持中文
第 1 步:下载中文字体包
常用的中文字体为:SimHei,给出一下链接可选择:
https://github.com/StellarCN/scp_zh/blob/master/fonts/SimHei.ttf
http://www.xiazaiziti.com/210356.html
https://www.wfonts.com/font/simhei
第 2 步:将下载的中文字体包拷贝到 matplotlib 的字体库中
如何查看matplotlib字体库路径:
使用matplotlib_fname函数找到对应的安装包所在位置,方法如下:
import matplotlib
print(matplotlib.matplotlib_fname())
在得到的路径后添加/fonts/ttf,即可得到matplotlib字体库的路径
E:\Environment\python3.8\lib\site-packages\matplotlib\mpl-data\fonts\ttf
将所下载的字体包中:SimHei.ttf 文件拷贝到该路径下
第 3 步:修改 matplotlibrc 文件
在matplotlibrc 安装位置中以文档方式打开 matplotlibrc 文件,找到 font.serif,font.sans-serif 所在位置,如下如所示。在冒号后面加入SimHei,保存退出,重启 spyder,完成。
E:\Environment\python3.8\lib\site-packages\matplotlib\mpl-data\matplotlibrc
如下方式进行添加:
import numpy as np
import pandas as pd
import matplotlib.pyplot as mpl_pp
file = open('user.json', encoding='utf-8')
user_data = pd.read_json(file, orient='recodes')