pandas 统计类函数

  • Post author:
  • Post category:其他




pandas 统计类函数

先生成测试数据,包括学生各科成绩:

import pandas as pd
data=pd.DataFrame({'name':['Abbe','Tony','Henry','Perry','Billy','Tracy'],
                  'english':[99,89,68,73,82,78],
                   'math':[89,81,78,69,81,92],
                   'science':[81,83,87,91,86,92]
                  })
data
name english math science
0 Abbe 99 89 81
1 Tony 89 81 83
2 Henry 68 78 87
3 Perry 73 69 91
4 Billy 82 81 86
5 Tracy 78 92 92



1.汇总类统计



1.统计描述describe()

返回 DataFrame 中

数值列

数据的常见统计数据,返回一个 DataFrame 的数据表。

具体如下:

count(计数)、mean(平均值)、std(标准差)、min(最小值)、

25%(排在25%处的值)、50%(排在50%处的值)、75%(排在75%处的值)、max(最大值) 等。

data.describe()
english math science
count 6.000000 6.000000 6.000000
mean 81.500000 81.666667 86.666667
std 11.220517 8.189424 4.320494
min 68.000000 69.000000 81.000000
25% 74.250000 78.750000 83.750000
50% 80.000000 81.000000 86.500000
75% 87.250000 87.000000 90.000000
max 99.000000 92.000000 92.000000

也可以只对某一列进行统计描述,返回一个 Series 类型的数据。

data['english'].describe()
count     6.000000
mean     81.500000
std      11.220517
min      68.000000
25%      74.250000
50%      80.000000
75%      87.250000
max      99.000000
Name: english, dtype: float64



2.计数count()

对每列或每行的

非空单元格进行计数

参数列表:

DataFrame.count(

axis

=0, level=None, numeric_only=False)

axis : {0 or ‘index’, 1 or ‘columns’},默认为 0。

  • If 0 or ‘index’:为每列生成计数。
  • If 1 or ‘columns’:为每行生成计数。

返回 DataFrame 中

所有行/列

的计数,返回一个 Series 类型的数据。


列计数

data.count()    # 默认axis=0,为列生成计数
name       6
english    6
math       6
science    6
dtype: int64


行计数

data.count(axis=1)    # axis=1,为行生成计数
0    4
1    4
2    4
3    4
4    4
5    4
dtype: int64



3.求和sum()

返回请求轴的值之和。

参数列表:

data.sum(

axis

=0, skipna=None, level=None, numeric_only=None, min_count=0, **kwargs,)

axis : {index (0), columns (1)}

axis也是默认为0(列求和),axis=1时表示行求和。

返回 DataFrame 中

所有行/列

的求和,返回一个 Series 类型的数据。


列求和

data.sum()    # 默认axis=0,进行 列求和
name       AbbeTonyHenryPerryBillyTracy
english                             489
math                                490
science                             520
dtype: object

注:在python中,字符串类型的数据也可以直接进行求和(连接字符串)。


行求和

data.sum(axis=1)    # axis=1,进行 行求和
0    269
1    253
2    233
3    233
4    249
5    262
dtype: int64


案例

:我们就可以新增一列,来存放每个学生的总成绩。

new_data=data.assign(总成绩=data.sum(axis=1))
new_data
name english math science 总成绩
0 Abbe 99 89 81 269
1 Tony 89 81 83 253
2 Henry 68 78 87 233
3 Perry 73 69 91 233
4 Billy 82 81 86 249
5 Tracy 78 92 92 262

注:后面的每一个函数都可以

对 axis 值进行设定,表示对行/列进行操作

,就不一一赘述。



4.平均值mean()

返回 DataFrame 中

数值行/列

的平均值,返回一个 Series 类型的数据。

data.mean()
english    81.500000
math       81.666667
science    86.666667
dtype: float64



5.最大值max()

返回 DataFrame 中

所有行/列

的最大值,返回一个 Series 类型的数据。

data.max()
name       Tracy
english       99
math          92
science       92
dtype: object

注:在python中,字符串类型的数据也可以比大小(根据字母排序)。



6.最小值max()

返回 DataFrame 中

所有行/列

的最小值,返回一个 Series 类型的数据。

data.min()
name       Abbe
english      68
math         69
science      81
dtype: object



7.中位数median()

中位数是指按顺序排列的一组数据中居于中间位置的数。

data.median()
english    80.0
math       81.0
science    86.5
dtype: float64



8.众数mode()

众数是指一组数据中出现次数最多的数。

data.mode()
name english math science
0 Abbe 68 81.0 81
1 Billy 73 NaN 83
2 Henry 78 NaN 86
3 Perry 82 NaN 87
4 Tony 89 NaN 91
5 Tracy 99 NaN 92



9.绝对值abs()

返回数据的绝对值。

注意:绝对值函数abs()是针对

数值型的字段

,不能对字符类型的字段求绝对值。

data[['english','math']].abs()
english math
0 99 89
1 89 81
2 68 78
3 73 69
4 82 81
5 78 92



10.乘积prod()

返回请求轴的值之积。

data.prod()
english    279746994384
math       289128940776
science    421124040792
dtype: int64



11.方差var()


方差是衡量随机变量或一组数据离散程度的度量

每个样本值与全体样本值的平均数之差的平方和的平均数。

需要注意的是:numpy中的方差叫总体方差,

pandas中的方差叫样本方差


总体方差的分母为 n ,是有偏的;样本方差的分母为 n-1 ,是无偏的

参考:

百度百科-方差

data.var()
english    125.900000
math        67.066667
science     18.666667
dtype: float64


验证英语学科的方差

  • 1.平均值:data[‘english’].mean()=81.5;

  • 2.用英语成绩中的每个元素依次减去平均值,然后求平方和:

    (68-81.5)**2+(73-81.5)**2+(78-81.5)**2+(82-81.5)**2+(89-81.5)**2+(99-81.5)**2;

  • 3.最后除以

    样本例数n-1

    ,即除以6-1=5。

((68-81.5)**2+(73-81.5)**2+(78-81.5)**2+(82-81.5)**2+(89-81.5)**2+(99-81.5)**2)/5
125.9



12.标准差std()

返回 DataFrame 中

数值行/列

的标准差值,返回一个 Series 类型的数据。

标准差是

一组数据离散程度

的一种度量。

一个较大的标准差,代表大部分数值和其平均值之间差异较大;

一个较小的标准差,代表这些数值较接近平均值。

参考:

百度百科-标准差

data.std()
english    11.220517
math        8.189424
science     4.320494
dtype: float64



13.累计求和cumsum()

可以对指定轴进行

行或列的累计求和

(包括字符串类型的列)。

data.cumsum()
name english math science
0 Abbe 99 89 81
1 AbbeTony 188 170 164
2 AbbeTonyHenry 256 248 251
3 AbbeTonyHenryPerry 329 317 342
4 AbbeTonyHenryPerryBilly 411 398 428
5 AbbeTonyHenryPerryBillyTracy 489 490 520

这与窗口函数

expanding().sum()

实现的效果是一样的。

只是expanding().sum()只会对数值类型的数据进行累计求和。

data.expanding().sum() 
english math science
0 99.0 89.0 81.0
1 188.0 170.0 164.0
2 256.0 248.0 251.0
3 329.0 317.0 342.0
4 411.0 398.0 428.0
5 489.0 490.0 520.0



2.去重和按值计数



1.去重unique()

查看某一行或列有哪些非非重复值。

一般不用于数值列,而是枚举、分类列。返回一个 ndarray 类型的数据。

data['name'].unique()
array(['Abbe', 'Tony', 'Henry', 'Perry', 'Billy', 'Tracy'], dtype=object)



2.非重复计数nunique()

如何统计非重复值的个数呢?

由于unique()函数返回的数据类型为 ndarray ,不能直接使用count()函数。

ndarray类型的数据有一个

shape

属性,返回 ndarray数据的行和列,

ndarray.shape[0]

就代表了ndarray数据的行数。

所以我们可以用下面的方式来

获取去重后的个数

data['name'].unique().shape[0]
6

pandas还专门提供了一个函数

nunique()

,来进行非重复计数。

data['name'].nunique()
6



3.按值计数value_counts()

value_counts()函数可以对某列的各个值统计个数,返回一个 Series 类型的数据。

data['math'].value_counts()  # 统计数学成绩中各个值出现的次数
81    2
92    1
78    1
69    1
89    1
Name: math, dtype: int64



3.协方差和相关系数



1.协方差和相关系数简介

协方差:corvariance;相关系数:correlation


协方差

简单地来说,协方差就是反映

两个变量 X 和 Y 的相互关系

。这种相互关系大致分为三种:

正相关、负相关、不相关

什么是正相关呢?例如:房屋面积(X)越大,房屋总价(Y)越高,则房屋面积与房屋总价是正相关的;

什么是负相关呢?例如:一个学生打游戏的时间(X)越多,学习成绩(Y)越差,则打游戏时间与学习成绩是负相关的;

什么是不相关呢?例如:一个人皮肤的黑白程度(X)与他的身体健康程度(Y)并无明显关系,所以是不相关的。


相关系数

计算协方差的时候我们并没有把不同变量幅值差异性考虑进来,在比较协方差的时候也就没有一个统一的量纲标准。

所以,为了消除这一影响,为了准确得到变量之间的相似程度,我们需要

把协方差除以各自变量的标准差

可见,相关系数就是在协方差的基础上除以变量 X 和 Y 的标准差。

为什么除以各自变量的标准差就能消除幅值影响呢?这是因为标准差本身反映了变量的幅值变化程度,除以标准差正好能起到抵消的作用,让协方差标准化。这样,

相关系数的范围就被归一化到 [-1,1] 之间了


总结


相关系数是协方差的标准化、归一化形式

,消除了量纲、幅值变化不一的影响。

实际应用中,在比较不同变量之间相关性时,使用相关系数更为科学和准确。

参考:

通俗解释协方差与相关系数



2.计算协方差

协方差和相关系数都是一个

相互的概念

,必须计算两个变量(两列)之间的协方差或相关系数,不能只用一列来计算协方差或相关系数。

使用

cov()

函数来计算协方差。


协方差矩阵

(计算 DataFrame 中

任意“数值列”之间的协方差

):

data.cov()
english math science
english 125.9 48.800000 -37.400000
math 48.8 67.066667 -7.933333
science -37.4 -7.933333 18.666667


计算指定两列之间的协方差

# 计算英语和数学之间的协方差
data['english'].cov(data['science']) 
-37.4



3.计算相关系数

使用

corr()

函数来计算相关系数。


相关系数矩阵

(计算 DataFrame 中

任意“数值列”之间的相关系数

):

data.corr()
english math science
english 1.000000 0.531072 -0.771481
math 0.531072 1.000000 -0.224217
science -0.771481 -0.224217 1.000000


计算指定两列之间的相关系数

# 计算英语和数学之间的相关系数
data['english'].corr(data['math']) 
0.5310722343446015



版权声明:本文为lengxuan001原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。