Python 基于 Pandas 第三方库进行数据分析、数据处理详细教程(更新中)

Pandas 第三方库 概述和安装

Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。Pandas 已经成为 Python 数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具。

Python 基于 Pandas 第三方库进行数据分析、数据处理详细教程(更新中)_第1张图片
Pandas 是什么?

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 主要特点

  • 它提供了简单、高效、带有默认标签(也可以自定义标签)的 DataFrame 对象。
  • 快速得从不同格式的文件中加载数据(比如 Excel、CSV 、SQL文件),然后将其转换为可处理的对象。
  • 按数据的行、列标签进行分组,并对分组后的对象执行聚合和转换操作。
  • 很方便地实现数据归一化操作和缺失值处理。
  • 很方便地对 DataFrame 的数据列进行增加、修改或者删除的操作。
  • 处理不同格式的数据集,比如矩阵数据、异构数据表、时间序列等。
  • 提供了多种处理数据集的方式,比如构建子集、切片、过滤、分组以及重新排序等。

和其它语言的数据分析包相比,Pandas 优势

  • Pandas 的 DataFrame 和 Series 构建了适用于数据分析的存储结构。
  • Pandas 简洁的 API 能够让你专注于代码的核心层面。
  • Pandas 实现了与其他库的集成,比如 Scipy、scikit-learn 和 Matplotlib。
  • Pandas 官方网站(点击访问)提供了完善资料支持,及其良好的社区环境。

Pandas 安装

Python 官方标准发行版并没有自带 Pandas 库,因此需要另行安装。除了标准发行版外,还有一些第三方机构发布的 Python 免费发行版, 它们在官方版本的基础上开发而来,并有针对性的提前安装了一些 Python 模块,从而满足某些特定领域的需求,比如专门适应于科学计算领域的 Anaconda,它就提前安装了多款适用于科学计算的软件包。

pip install pandas

Pandas 内置数据结构

我们知道,构建和处理二维、多维数组是一项繁琐的任务。Pandas 为解决这一问题, 在 ndarray 数组(NumPy 中的数组)的基础上构建出了两种不同的数据结构,分别是 Series(一维数据结构)DataFrame(二维数据结构):

  • Series 是带标签的一维数组,这里的标签可以理解为索引,但这个索引并不局限于整数,它也可以是字符类型,比如 a、b、c 等;

  • DataFrame 是一种表格型数据结构,它既有行标签,又有列标签。

数据结构做简单地的说明:

Python 基于 Pandas 第三方库进行数据分析、数据处理详细教程(更新中)_第2张图片
由于上述数据结构的存在,使得处理多维数组数任务变的简单。在《Pandas Series入门教程》和《Pandas DataFrame入门教程(图解)》两节中,我们会对上述数据结构做详细讲解。

Pandas 内置数据结构 教程

Pandas Series:《Pandas Series入门教程》

DataFrame:《Pandas DataFrame入门教程(图解)》

创建 Pandas Series 对象

Series 结构,也称 Series 序列,是 Pandas 常用的数据结构之一,它是一种类似于一维数组的结构,由一组数据值(value)和一组标签组成,其中标签与数据值之间是一一对应的关系。

Series 可以保存任何数据类型,比如整数、字符串、浮点数、Python 对象等,它的标签默认为整数,从 0 开始依次递增。Series 的结构图,如下所示:

Python 基于 Pandas 第三方库进行数据分析、数据处理详细教程(更新中)_第3张图片

最左边的列,通过标签我们可以更加直观地查看数据所在的索引位置。

创建 Series 对象

首先介绍 Series 对象的属性:

Python 基于 Pandas 第三方库进行数据分析、数据处理详细教程(更新中)_第4张图片

Pandas 使用 Series() 函数来创建 Series 对象,通过这个对象可以调用相应的方法和属性,从而达到处理数据的目的:

import pandas as pd
s = pd.Series(data, index, dtype, copy)

相关参数说明:

Python 基于 Pandas 第三方库进行数据分析、数据处理详细教程(更新中)_第5张图片
ndarray 创建 Series 对象

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)

访问 Pandas Series 对象

上述讲解了创建 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']])

创建 Pandas DataFrame 对象

DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。其结构图示意图,如下所示:

Python 基于 Pandas 第三方库进行数据分析、数据处理详细教程(更新中)_第6张图片
表格中展示了某个销售团队个人信息和绩效评级(rating)的相关数据。数据以行和列形式来表示,其中每一列表示一个属性,而每一行表示一个条目的信息。

创建 DataFrame 对象的语法格式如下:

import pandas as pd
pd.DataFrame( data, index, columns, dtype, copy)

相关参数说明:

Python 基于 Pandas 第三方库进行数据分析、数据处理详细教程(更新中)_第7张图片
创建空的 DataFrame 对象

使用下列方式创建一个空的 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 相差无几,如下所示:

Python 基于 Pandas 第三方库进行数据分析、数据处理详细教程(更新中)_第8张图片

列索引 Pandas DataFrame 对象

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)

行索引 Pandas DataFrame 对象

理解了上述的列索引操作后,行索引操作就变的简单。下面看一下,如何使用行索引来选取 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 相差无几,如下所示:
Python 基于 Pandas 第三方库进行数据分析、数据处理详细教程(更新中)_第9张图片

Pandas 描述性统计

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能够筛选字符列或者数字列的摘要信息。

Pandas 数据可视化绘图常见问题

常见问题

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

在这里插入图片描述

如下方式进行添加:

在这里插入图片描述

Pandas 读取 json 文件

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')

你可能感兴趣的:(Python常见实用技术栏,python,pandas,数据分析)