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:内插值,可选参数,用于指定要使用的插值方法,当期望的分位数为数据点i~j时。
线性:i+(j-i)×分数,其中分数是指数被i和j包围的小数部分。
较低:i。
较高:j。
最近:i或j二者以最近者为准。
中点:(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