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