前言

统计分析是数据分析的重要组成部分,它几乎贯穿了整个数据分析的流程。运用统计方法,将定量问题与定性问题结合进行的研究活动叫作统计分析。统计分析除了包含单数值型特征的数据集中趋势、离散趋势和峰度与偏度等统计知识外,还包含多个特征间的比较计算等知识。以下将介绍使用pandas库进行统计分析所需要掌握的基本知识。


一、认识pandas

pandas是Python的核心数据分析支持库。提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系数据、标记数据。因为pandas建造在NumPy的基础之上,所以在以NumPy为心的应用中。pandas易于使用,而pandas库在与其他第三方科学计算支持库结合时也能够较完美地进行集成。

在Python中,pandas库的功能十分强大,它可提供高性能的矩阵运算;可用于数据挖掘和数据分析,同时也提供数据清洗功能;支持类似SQL的数据增、删、查、改等操作.并且带有丰富的数据处理函数;支持时间序列数据分析功能;支持灵活处理缺失数据等。

pandas 有两个强大的利器:Scries(一维数据)与DataFrame(二维数据)。Series是一种类似于一维数组的对象,是由一组数据(使用各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成,而仅由一组数据也可产生简单的Series对象。DataFrame 是pandas中的一个表格型的数据结构,包含一组有序的列,这些列可以使用不同类型的数据(数值、字符串、布尔值等),DataFrame 既有行索引也有列索引,可以看作由 Series组成的字典。

同时Series和DataFrame还是pandas中常用的数据结构,运用这两种数据结构便足以处理金融、统计、社会科学、工程等领域里的大多数典型问题。

二、使用方法

1.引入库

代码如下:

import pandas as pd

2.常规读取数据方式

一种是csv文件

data = pd.read_csv('C:/Users/21559/Desktop/data.csv')
data.head()

一种是xlsx文件

data = pd.read_excel('C:/Users/21559/Desktop/data.xlsx')
data.head()

注意:
读取数据是可以用绝对路径相对路径这两种路径,这里用的是绝对路径。
如果在读取csv文件数据中出现如图的错误,大部分可以使用encoding=‘gbk’

这里以一个实例贯穿本文,实例如图:
在这里插入图片描述

3.DataFrame的常规操作

DataFrame 是较为常用的pandas对象,类似于Excel表格。完成数据读取后,数据将以DataFrame数据结构存储在内存中。但此时并不能直接开始统计分析工作,需要使用DataFrame的属性与方法对数据的分布、大小等基本的数据状况有了解。只有对数据基本状况有了深度的了解,才能够进行量身定制的统计分析。
3.1 查看DataFrame的常用属性
DataFrame的基础属性有valueindexcolumnsdtyps,分别可以获取元素、索引、列名和数据类型。

data.values
data.index
data.columns
data.dtyps

除了上述4个基本属性外,还可以通过sizendimshape属性来获取DataFrame的元素个数、维度和形状。

data.size
data.ndim
data.shape

3.2 查、改、增、删DataFrame数据

3.2.1 查看DataFrame数据

除了可以使用基本的查看方式查看DataFrame数据之外,还可以通过loc()方法和iloc()方法对DataFrame数据进行访问。

(1)DataFrame数据的基本查看方式
DataFrame的单列数据为一个Series。根据DataFrame的定义可知,DataFrame是一个带有标签的二维数组,每个标签相当于每列的列名。只要以字典访问某一个键的值的方式使用对应的列名,即可实现对单列数据的访问。实例如图:
在这里插入图片描述
data_1:随意取的名字

除了使用字典访问内部数据的方式之外,还能以访问属性的方式访问DataFrame数据,但是并不建议使用。因为在多数情况下数据的列名为英文,以属性访问某一列的方式和DataFrame属性访问方式,其方法和使用的格式相同,难免存在部分列名和pandas提供的方法名相同的情况。这会引起程序混乱,也会使得代码晦涩难懂。

当访问DataFrame中某一列的某几行数据时,单独一列的DataFrame可以视为一个Series,而访问Series基本和访问一维的ndarray相同。实例如图:
在这里插入图片描述
访问DataFrame多列数据时可以将多个列名放入同一个列表。同时,访问DataFrame多列数据中的多行数据和访问单列数据的多行数据的方法基本相同,实例如图:
在这里插入图片描述
如果只需要访问DataFrame某几行数据,那么实现方法和上述的访问多列的多行数据的相似,选择所有列,使用":“即可,实例如图:
在这里插入图片描述
除了使用上述方法能够得到多行数据外,通过DataFrame提供的方法head()和tail()也可以得到多行数据,但是用这两种方法得到的数据都是从开始或末尾获取的连续数据,实例如图:
在这里插入图片描述
因为head()和tail()方法使用的都是默认参数,所以访问的分别是前5行、后5行。只要在方法前后的”()"中输入访问行数,即可实现目标行数的查看。

(2)DataFrame数据的loc()、iloc()访问方式

DataFrame的数据查看与访问的基本方法虽然能够基本满足数据查看要求,但是终究还不够灵活。pandas提供了loc()和iloc()两种更加灵活的方法来实现数据访问。

loc()方法是针对DataFrame索引名称的切片方法,如果传入的不是索引名称,那么切片操作将无法执行。利用loc()方法,能够实现对所有单层索引的切片操作。loc()方法的基本使用格式如下:

DataFrame.loc[行列或条件,列名]

iloc()方法和loc()方法的区别是,iloc()方法接收的必须是行索引和列索引的位置。iloc()方法的基本使用格式如下:

DataFrame.iloc[行索引位置,列索引位置]

使用loc()方法和iloc()分别实现单列切片,实例如图:
在这里插入图片描述
同时,还可以使用loc()方法和iloc()方法实现多列切片,其原理是将多列的列名或位置作为列表数据传入,实例如图:
在这里插入图片描述
总的来说,loc()方法更加灵活多变、代码的可读性更高;iloc()方法的代码姬简洁,但可读性不高。在数据分析工作中具体使用哪一种方法,应根据情况而定,大多数时候建议使用loc()方法。

3.2.2 更改DataFrame中的数据

更改DataFrame中的数据的原理是将其部分数据亮出来,重新赋值为新的数据,实例如下:
在这里插入图片描述
需要注意的是,数据更改是直接对DataFrame原数据进行更改,该操作无法撤销。如果不希望直接对原数据做出更改,那么需要对更改条件进行确认或对数据进行备份。

3.2.3 为DataFrame新增数据

为DataFrame新增数据的方法非常简单,只需要新建一个列索引,并对该索引下的数据进行赋值操作即可,实例代码如下:

#转化为时间序列数据
datas=pd.to_datetime(musicdata['date'])
#建立月份列
musicdata['month']=dates.map(lambda x:x.month)
#查看前5行
musicdata['month'].head()

标注:需要引进musicdata数据

如果新增的一列值是相同的,那么直接为其赋值一个常量即可,实例代码如下:

#新增列day
musicdata['day']=15
#查看前5行
musicdata['day'].head()

3.2.4 删除某列或某行数据

删除某列或某行数据需要用到pandas提供的drop()方法。drop()方法的基本使用格式如下:

DataFrame.drop(labels,axis=0,index=None,column=None,level=None,inplace=False,,errors='raise')

drop()方法的常用参数及其说明如表所示:

参数名称 参数说明
labels 接收单一标签。表示要删除的列或行的索引。无默认值
axis 接收0或1。表示操作的轴。默认为0
inplace 接收bool。表示操作是否对原数据生效。默认为False

使用drop()方法删除某列数据,实例如图:
在这里插入图片描述
要删除某行数据,只需要将drop()方法的labels参数换成对应的行索引,将axis参数设置为0即可,实例如图:
在这里插入图片描述

3.3 描述分析DataFrame数据

描述性统计是用于概括、表述事物整体状况,以及事物间关联、类属关系的统计方法,通过几个统计值可简洁地表示一组数据的集中趋势和离散程度等。

3.3.1 数值型特征的描述性统计

数值型特征的描述性主要包括计算数值型数据的最小值、均值、中位数、最大值、四分位数、极差、标准差、方差、协方差和变异系数等。

在NumPy库中已经提供了为数不少的统计函数,为方便查看,将NumPy库简写为np,部分统计函数如表所示:

函数名称 函数说明
np.min 最小值
np.max 最大值
np.mean 均值
np.ptp 极差
np.median 中位数
np.std 标准差
np.var 方差
np.cov 协方差

pandas库是基于NumPy库的,自然也可以使用上表中的统计函数对数据进行描述性统计。

同时,作为专门为数据分析而生的Python库,pandas还提供了一个describe()方法,能够一次性得出DataFrame中所有数值型特征的非空值数量、均值、标准差、最小值、分位数和最大值等。实例如图:
在这里插入图片描述
通过describe()方法对DataFrame进行描述性统计,比起用np.mean函数对每一个统计量分别进行计算无疑要方便很多,也非常实用。另外,pandas还提供了与统计相关的主要函数,如表所示,这些函数能够胜任绝大多数数据分析所需要的数值型特征的描述性统计工作。

函数名称 函数说明 函数名称 函数说明
min 最小值 max 最大值
mean 均值 ptp 极差
median 中位数 std 标准差
var 方差 cov 协方差
sem 标准误差 mode 众数
skew 样本偏度 kurt 样本峰度
quantile 分位数 count 非空值数目
describe 描述统计 mad 平均绝对离差

3.3.2 类别型特征描述统计

描述类型特征的分布状况,可以使用频数统计。在pandas库中实现频数统计的方法为value_counts()。实例如图:
在这里插入图片描述

除了使用value_counts()方法分析频数外,pandas还提供了category类型,可以使用astype()方法将目标特征的数据类型转换为category类型,实例如图:
在这里插入图片描述
describe()方法除了支持传统数值型数据以外,还支持对category类型的数据进行描述性统计,得到的4个统计量分别为列非空元素的数目、类别的数目、数目最多的类别和数目最多类别的数目,实例如图:
在这里插入图片描述

4.使用分组聚合进行组内计算

4.1 使用groupby()方法拆分数据

groupby()方法提供的是分组聚合步骤中的拆分功能,能够根据索引或特征对数据进行分组,其基本使用格式如下:

DataFrame.groupby(by=None,axis=0,level=None,as_index=True,sort=Ture,group_keys=True,squeeze=<no_default>,observed=False,dropna=True)

groupby()方法的常用参数及其说明如表所示:

参数名称 参数说明
by 接收list、str、mapping、function或generator。表示分组的依据。若传入的是函数,则对索引进行计算并分组;若传入的是dict或Series,则将dict或Series的值作为分组依据;若传入NumPy数组,则以数据的元素作为分组依据;若传入的是str或str型list,则使用其所代表的特征作为分组依据。默认值为None
axis 接收0或1.表示操作的轴。默认为0
level 接收int或索引名。表示标签所在级别。默认为None
as_index 接收bool。表示聚合后的聚合标签是否以DataFrame形式输出。默认为True
sort 接收bool。表示是否对分组依据、分组标签进行排序。默认为True
group_keys 接收bool。表示是否显示分组标签的名称。默认为True

对数据进行分组,实例如图:
在这里插入图片描述
由上图可知,分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址。实际上,分组后的数据对象DataFrameGroupBy(下称GroupBy),类似于Series与DataFrame,也是pandas提供的一种对象。GroupBy对象常用的描述性统计方法及说明如表所示:

方法名称 方法说明 方法说明 方法名称
count() 返回各组的计数值,不包括缺失值 cumcount() 对每个分组中的组员进行标记,0~n-1
head() 返回每组的前n个值 size() 返回每组的大小
max() 返回每组的最大值 min() 返回每组的最小值
mean() 返回每组的均值 std() 返回每组的标准差
median() 返回每组的中位数 sum() 返回每组的和

上表中的方法为查看每一组的整体情况、分布状态提供了良好的支持。

4.2 使用agg()方法聚合数据

agg()方法和aggregate()方法都支持对每个分组应用某些函数,包括Python内置函数或自定义函数。同时,这两个方法也能够直接对DataFrame进行函数应用操作。DataFrame的agg()方法与aggregate()方法的基本使用格式如下:

DataFrame.agg(func,axis=0, *args, **kwargs)
DataFrame.aggregate(func,axis=0, *args, **kwargs)

agg()方法和aggregate()方法的常用参数及其说明如表所示:

参数名称 参数说明
func 接收list、dict、function或str。表示用于聚合数据的函数。无默认值
axis 接收0或1.代表操作的轴。默认为0

在正常使用过程中,agg()方法和aggregate()方法对DataFrame对象进行操作时的功能几乎完全相同,因此只需要掌握其中一个方法即可。

若需要对不同的特征应用不同的函数,则与在DataFrame中使用agg()方法的操作相同。

4.3 使用apply()方法聚合数据

apply()方法类似于agg()方法,能够将函数应用于每一列。不同之处在于,与apply()方法相比,apply()方法传入的函数只能够作用于整个DataFrame或Series,而无法像agg()方法一样能够对不同特征应用于不同函数来获取不同结果。apply()方法的基本使用格式如下:

DataFrame.apply(func,axis=0,raw=False,result_type=None,args=(), **kwargs)

apply()方法的常用参数及其说明如表所示:

参数名称 参数说明
func 接收函数。表示应用于每行或每列的函数。无默认值
axis 接收0或1。表示操作的轴。默认为0
raw 接收bool。表示是否直接将ndarray对象传递给函数。默认为False

apply()方法的使用方式和agg()方法相同。

4.4 使用transform()方法聚合函数

transform()方法能够对整个DataFrame的所有元素进行操作,其基本格式如下:

DataFrame.transform(func,axis=0, *args, **kwargs)

transform()方法的常用参数及其说明如表所示:

参数名称 参数说明
func 接收函数、str、类列表或类字典。表示用于转换的函数。无默认值
axis 接收0或’index’、1或’columns’。代表操作的轴。默认为0
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐