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
 
