Python数据分析从入门到精通
上QQ阅读APP看书,第一时间看更新

4.1 数据计算

Pandas提供了大量的数据计算函数,可以实现求和、求均值、求最大值、求最小值、求中位数、求众数、求方差、标准差等,从而使得数据统计变得简单高效。

4.1.1 求和(sum()函数)

在Python中通过调用DataFrame对象的sum()函数实现行/列数据的求和运算,语法如下:

DataFrame.sum(axis=None, skipna=None, level=None, numeric_only=None, min_count=0, **kwargs)

参数说明:

 axis:axis=1表示行,axis=0表示列,默认值为None(无)。

 skipna:布尔型,表示计算结果是否排除NaN/Null值,默认值为None。

说明

NaN表示非数值。在进行数据处理、数据计算时,Pandas会为缺少的值自动分配NaN值。

 level:表示索引层级,默认值为None。

 numeric_only:仅数字,布尔型,默认值为None。

 min_count:表示执行操作所需的数目,整型,默认值为0。

 **kwargs:要传递给函数的附加关键字参数。

 返回值:返回Series对象或DataFrame对象。行或列求和数据。

【示例01】 计算语文、数学和英语三科的总成绩。(示例位置:资源包\MR\Code\04\01)

首先,创建一组DataFrame类型的数据,包括语文、数学和英语三科的成绩,如图4.1所示。

程序代码如下:

下面使用sum()函数计算三科的总成绩,代码如下:

df['总成绩']=df.sum(axis=1)

运行程序,输出结果如图4.2所示。

图4.1 DataFrame数据

图4.2 sum()函数计算三科的总成绩

4.1.2 求均值(mean()函数)

在Python中通过调用DataFrame对象的mean()函数实现行/列数据平均值运算,语法如下:

DataFrame.mean(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)

参数说明:

 axis:axis=1表示行,axis=0表示列,默认值为None(无)。

 skipna:布尔型,表示计算结果是否排除NaN/Null值,默认值为None。

 level:表示索引层级,默认值为None。

 numeric_only:仅数字,布尔型,默认值为None。

 **kwargs:要传递给函数的附加关键字参数。

 返回值:返回Series对象或DataFrame对象。行或列平均值数据。

【示例02】 计算语文、数学和英语各科的平均分。(示例位置:资源包\MR\Code\04\02)

计算语文、数学和英语各科成绩的平均值,程序代码如下:

运行程序,输出结果如图4.3所示。

图4.3 mean()函数计算三科成绩的平均值

从运行结果得知:语文平均分109,数学平均分107,英语平均分114.667。

4.1.3 求最大值(max()函数)

在Python中通过调用DataFrame对象的max()函数实现行/列数据最大值运算,语法如下:

DataFrame.max(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)

参数说明:

 axis:axis=1表示行,axis=0表示列,默认值为None(无)。

 skipna:布尔型,表示计算结果是否排除NaN/Null值,默认值为None。

 level:表示索引层级,默认值为None。

 numeric_only:仅数字,布尔型,默认值为None。

 **kwargs:要传递给函数的附加关键字参数。

 返回值:返回Series对象或DataFrame对象。行或列最大值数据。

【示例03】 计算语文、数学和英语各科的最高分。(示例位置:资源包\MR\Code\04\03)

计算语文、数学和英语各科成绩的最大值,程序代码如下:

运行程序,输出结果如图4.4所示。

图4.4 max()函数计算三科成绩的最大值

从运行结果得知:语文最高分112分,数学最高分120分,英语最高分130分。

4.1.4 求最小值(min()函数)

在Python中通过调用DataFrame对象的min()函数实现行/列数据最小值运算,语法如下:

DataFrame.min(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)

参数说明:

 axis:axis=1表示行,axis=0表示列,默认值为None(无)。

 skipna:布尔型,表示计算结果是否排除NaN/Null值,默认值为None。

 level:表示索引层级,默认值为None。

 numeric_only:仅数字,布尔型,默认值为None。

 **kwargs:要传递给函数的附加关键字参数。

 返回值:返回Series对象或DataFrame对象。行或列最小值数据。

【示例04】 计算语文、数学和英语各科的最低分。(示例位置:资源包\MR\Code\04\04)

计算语文、数学和英语各科成绩的最小值,程序代码如下:

运行程序,输出结果如图4.5所示。

图4.5 min()函数计算三科成绩的最小值

从运行结果得知:语文最低分105分,数学最低分88分,英语最低分99分。

4.1.5 求中位数(median()函数)

中位数又称中值,是统计学专有名词,是指按顺序排列的一组数据中位于中间位置的数,其不受异常值的影响。例如,年龄23、45、35、25、22、34、28这7个数,中位数就是排序后位于中间的数字,即28;而年龄23、45、35、25、22、34、28、27这8个数,中位数则是排序后位于中间两个数的平均值,即27.5。在Python中直接调用DataFrame对象的median()函数就可以轻松实现中位数的运算,语法如下:

DataFrame.median(axis=None,skipna=None,level=None,numeric_only=None,**kwargs)

参数说明:

 axis:axis=1表示行,axis=0表示列,默认值为None(无)。

 skipna:布尔型,表示计算结果是否排除NaN/Null值,默认值为None。

 level:表示索引层级,默认值为None。

 numeric_only:仅数字,布尔型,默认值为None。

 **kwargs:要传递给函数的附加关键字参数。

 返回值:返回Series对象或DataFrame对象。

【示例05】 计算学生各科成绩的中位数1。(示例位置:资源包\MR\Code\04\05)

下面给出一组数据(3条记录),然后使用median()函数计算语文、数学和英语各科成绩的中位数,程序代码如下:

运行程序,控制台输出结果如下:

语文    130.0
数学    120.0
英语    130.0

【示例06】 计算学生各科成绩的中位数2。(示例位置:资源包\MR\Code\04\06)

下面再给出一组数据(4条记录),同样使用median()函数计算语文、数学和英语各科成绩的中位数,程序代码如下:

运行程序,控制台输出结果如下:

语文    121.5
数学    121.5
英语    120.0

4.1.6 求众数(mode()函数)

什么是众数?众数的众字有多的意思,顾名思义,众数就是一组数据中出现最多的数称为众数,它代表了数据的一般水平。

在Python中通过调用DataFrame对象的mode()函数可以实现众数运算,语法如下:

DataFrame.mode(axis=0,numeric_only=False,dropna=True)

参数说明:

 axis:axis=1表示行,axis=0表示列,默认值为0。

 numeric_only:仅数字,布尔型,默认值为False。如果值为True,则仅适用于数字列。

 dropna:是否删除缺失值,布尔型,默认值为True。

 返回值:返回Series对象或DataFrame对象。

首先看一组原始数据,如图4.6所示。

图4.6 原始数据

【示例07】 计算学生各科成绩的众数。(示例位置:资源包\MR\Code\04\07)

计算语文、数学和英语三科成绩的众数、每一行的众数和“数学”成绩的众数,程序代码如下:

三科成绩的众数:

每一行的众数:

0  110
1  130
2  130

数学成绩的众数:

0  120

4.1.7 求方差(var()函数)

方差用于衡量一组数据的离散程度,即各组数据与它们的平均数的差的平方,那么我们用这个结果来衡量这组数据的波动大小,并把它叫作这组数据的方差,方差越小越稳定。通过方差可以了解一个问题的波动性。下面简单介绍下方差的意义,相信通过一个简单的举例您就会了解。

例如,某校两名同学的物理成绩都很优秀,而参加物理竞赛的名额只有一个,那么选谁去获得名次的机率更大呢?于是根据历史数据计算出了两名同学的平均成绩,但结果是实力相当,平均成绩都是107.6,怎么办呢?这时让方差帮你决定,看看谁的成绩更稳定。首先汇总物理成绩,如图4.7所示。

图4.7 物理成绩

通过方差对比两名同学物理成绩的波动,如图4.8所示。

图4.8 方差

接着来看一下总体波动(方差和),“小黑”的数据是73.2,“小白”的数据是949.2,很明显“小黑”的物理成绩波动较小,发挥更稳定,所以应该选“小黑”参加物理竞赛。

以上举例就是方差的意义。大数据时代,它能够帮助我们解决很多身边的问题、协助我们做出合理的决策。

在Python中通过调用DataFrame对象的var()函数可以实现方差运算,语法如下:

DataFrame.var(axis=None,skipna=None,level=None,ddof=1,numeric_only=None,**kwargs)

参数说明:

 axis:axis=1表示行,axis=0表示列,默认值为None(无)。

 skipna:布尔型,表示计算结果是否排除NaN/Null值,默认值为None。

 level:表示索引层级,默认值为None。

 ddof:整型,默认值为1。自由度,计算中使用的除数是N-ddof,其中N表示元素的数量。

 numeric_only:仅数字,布尔型,默认值为None。

 **kwargs:要传递给函数的附加关键字参数。

 返回值:返回Series对象或DataFrame对象。

【示例08】 通过方差判断谁的物理成绩更稳定。(示例位置:资源包\MR\Code\04\08)

计算“小黑”和“小白”物理成绩的方差,程序代码如下:

运行程序,控制台输出结果如下:

小黑     18.3
小白    237.3

从运行结果得知:“小黑”的物理成绩波动较小,发挥更稳定。这里需要注意的是,Pandas中计算的方差为无偏样本方差(即方差和/样本数-1),NumPy中计算的方差就是样本方差本身(即方差和/样本数)。

4.1.8 标准差(数据标准化std()函数)

标准差又称均方差,是方差的平方根,用来表示数据的离散程度。

在Python中通过调用DataFrame对象的std()函数求标准差,语法如下:

DataFrame.std(axis=None,skipna=None,level=None,ddof=1,numeric_only=None,**kwargs)

std()函数的参数与var()函数一样,这里不再赘述。

【示例09】 计算各科成绩的标准差。(示例位置:资源包\MR\Code\04\09)

使用std()函数计算标准差,程序代码如下:

运行程序,控制台输出结果如下:

语文    11.547005
数学     5.773503
英语    11.547005

4.1.9 求分位数(quantile()函数)

分位数也称分位点,它以概率依据将数据分割为几个等份,常用的有中位数(即二分位数)、四分位数、百分位数等。分位数是数据分析中常用的一个统计量,经过抽样得到一个样本值。例如,经常会听老师说:“这次考试竟然有20%的同学不及格!”,那么这句话就体现了分位数的应用。在Python中通过调用DataFrame对象的quantile()函数求分位数,语法如下:

DataFrame.quantile(q=0.5,axis=0,numeric_only=True, interpolation='linear')

参数说明:

 q:浮点型或数组,默认为0.5(50%分位数),其值为0~1。

 axis:axis=1表示行,axis=0表示列。默认值为0。

 numeric_only:仅数字,布尔型,默认值为True。

 interpolation:内插值,可选参数,用于指定要使用的插值方法,当期望的分位数为数据点ij时。

 线性:i+(j-i)×分数,其中分数是指数被ij包围的小数部分。

 较低:i

 较高:j

 最近:ij二者以最近者为准。

 中点:(i+j)/2。

 返回值:返回Series或DataFrame对象。

【示例10】 通过分位数确定被淘汰的35%的学生。(示例位置:资源包\MR\Code\04\10)

以学生成绩为例,数学成绩分别为120、89、98、78、65、102、112、56、79、45的10名同学,现根据分数淘汰35%的学生,该如何处理?首先使用quantile()函数计算35%的分位数,然后将学生成绩与分位数比较,筛选小于等于分位数的学生,程序代码如下:

运行程序,控制台输出结果如下:

从运行结果得知:即将被淘汰的学生有4名,分数分别为78、65、56和45。

【示例11】 计算日期、时间和时间增量数据的分位数。(示例位置:资源包\MR\Code\04\11)

如果参数numeric_only=False,将计算日期、时间和时间增量数据的分位数,程序代码如下:

运行程序,控制台输出结果如下:

A                  1.5
B 2019-07-02 12:00:00
C          1 days 12:00:00
Name: 0.5, dtype: object