4.3 统计计算
Pandas可以对Series与DataFrame进行快速的描述性统计,如求和、平均数、最大值、方差等,这些是最基础也最实用的统计方法。对于DataFrame,这些统计方法会按列进行计算,最终产出一个以列名为索引、以计算值为值的Series。
4.3.1 描述统计
df.describe()会返回一个有多行的所有数字列的统计表,每一行对应一个统计指标,有总数、平均数、标准差、最小值、四分位数、最大值等,这个表对我们初步了解数据很有帮助。
df.describe() ''' Q1 Q2 Q3 Q4 count 100.000000 100.000000 100.000000 100.000000 mean 49.200000 52.550000 52.670000 52.780000 std 29.962603 29.845181 26.543677 27.818524 min 1.000000 1.000000 1.000000 2.000000 25% 19.500000 26.750000 29.500000 29.500000 50% 51.500000 49.500000 55.000000 53.000000 75% 74.250000 77.750000 76.250000 75.250000 max 98.000000 99.000000 99.000000 99.000000 '''
如果没有数字,则会输出与字符相关的统计数据,如数量、不重复值数、最大值(字符按首字母顺序)等。示例如下。
pd.Series(['a', 'b', 'c', 'c']).describe() ''' count 4 unique 3 top c freq 2 dtype: object '''
df.describe()也支持对时间数据的描述性统计:
(pd.Series(pd.date_range('2000-01-01', '2000-05-01')) .describe(datetime_is_numeric=True) ) ''' count 122 mean 2000-03-01 12:00:00 min 2000-01-01 00:00:00 25% 2000-01-31 06:00:00 50% 2000-03-01 12:00:00 75% 2000-03-31 18:00:00 max 2000-05-01 00:00:00 dtype: object '''
还可以自己指定分位数(一般情况下,默认值包含中位数),指定和排除数据类型:
df.describe(percentiles=[.05, .25, .75, .95]) df.describe(include=[np.object, np.number]) # 指定类型 df.describe(exclude =[np.object]) # 排除类型
4.3.2 数学统计
Pandas支持常用的数学统计方法,如平均数、中位数、众数、方差等,还可以结合NumPy使用其更加丰富的统计功能。我们先来使用mean()计算一下平均数,DataFrame使用统计函数后会生成一个Series,这个Series的索引为每个数字类型列的列名,值为此列的平均数。如果DataFrame没有任何数字类型列,则会报错。
df.mean() ''' Q1 49.20 Q2 52.55 Q3 52.67 Q4 52.78 dtype: float64 ''' type(df.mean()) # pandas.core.series.Series
Series应用数学统计函数一般会给出一个数字定值,直接计算出这一列的统计值:
df.Q1.mean() s.mean() # 49.2
如果我们希望按行计算平均数,即数据集中每个学生Q1到Q4的成绩的平均数,可以传入axis参数,列传index或0,行传columns或1:
df.mean(axis='columns') df.mean(axis=1) # 效果同上 df.mean(1) # 效果同上 ''' 0 49.50 1 41.75 2 54.75 3 84.50 4 65.25 ... 95 67.00 96 31.25 97 53.00 98 58.50 99 44.75 Length: 100, dtype: float64 '''
它仅对数字类型的列起作用,会忽略文本等其他类型。我们发现,索引仍然是默认的自然索引,无法辨认是谁的成绩,所以可以先创建name为索引再进行计算:
# 创建name为索引,计算每行平均值,只看前5条 df.set_index('name').mean(1).head() ''' name Liver 49.50 Arry 41.75 Ack 54.75 Eorge 84.50 Oah 65.25 dtype: float64 '''
4.3.3 统计函数
上文我们介绍了平均数mean,Pandas提供了非常多的数学统计方法,如下:
df.mean() # 返回所有列的均值 df.mean(1) # 返回所有行的均值,下同 df.corr() # 返回列与列之间的相关系数 df.count() # 返回每一列中的非空值的个数 df.max() # 返回每一列的最大值 df.min() # 返回每一列的最小值 df.abs() # 绝对值 df.median() # 返回每一列的中位数 df.std() # 返回每一列的标准差,贝塞尔校正的样本标准偏差 df.var() # 无偏方差 df.sem() # 平均值的标准误差 df.mode() # 众数 df.prod() # 连乘 df.mad() # 平均绝对偏差 df.cumprod() # 累积连乘,累乘 df.cumsum(axis=0) # 累积连加,累加 df.nunique() # 去重数量,不同值的量 df.idxmax() # 每列最大值的索引名 df.idxmin() # 每列最小值的索引名 df.cummax() # 累积最大值 df.cummin() # 累积最小值 df.skew() # 样本偏度(第三阶) df.kurt() # 样本峰度(第四阶) df.quantile() # 样本分位数(不同 % 的值)
Pandas还提供了一些特殊的用法:
# 很多支持指定行列(默认是axis=0列)等参数 df.mean(1) # 按行计算 # 很多函数均支持 df.sum(0, skipna=False) # 不除缺失数据 # 很多函数均支持 df.sum(level='blooded') # 索引级别 df.sum(level=0) # 执行加法操作所需的最小有效值数 df.sum(min_count=1)
以上统计函数会有自己的一些特别的参数用于限制计算规则,可以在使用过程中利用Jupyter Notebook查看函数说明来了解。
4.3.4 非统计计算
除了简单的数学统计外,我们往往还需要对数据做非统计性计算,如去重、格式化等。接下来我们将介绍一些数据的加工处理方法。
df.all() # 返回所有列all()值的Series df.any() # 四舍五入 df.round(2) # 指定字段指定保留小数位,如有 df.round({'Q1': 2, 'Q2': 0}) df.round(-1) # 保留10位 # 每个列的去重值的数量 df.nunique() s.nunique() # 本列的去重值 # 真假检测 df.isna() # 值的真假值替换 df.notna() # 与上相反
以下可以传一个值或者另一个DataFrame,对数据进行广播方式计算,返回计算后的DataFrame:
df + 1 # 等运算 df.add() # 加 df.sub() # 减 df.mul() # 乘 df.div() # 除 df.mod() # 模,除后的余数 df.pow() # 指数幂 df.dot(df2) # 矩阵运算
以下是Series专有的一些函数:
# 不重复的值及数量 s.value_counts() s.value_counts(normalize=True) # 重复值的频率 s.value_counts(sort=False) # 不按频率排序 s.unique() # 去重的值 array s.is_unique # 是否有重复 # 最大最小值 s.nlargest() # 最大的前5个 s.nlargest(15) # 最大的前15个 s.nsmallest() # 最小的前5个 s.nsmallest(15) # 最小的前15个 s.pct_change() # 计算与前一行的变化百分比 s.pct_change(periods=2) # 前两行 s1.cov(s2) # 两个序列的协方差
特别要掌握的是value_counts()和unique(),因为它们的使用频率非常高。
4.3.5 小结
数据统计是数据分析的最基本操作,本节介绍了数据的描述性统计、数学统计及一些常用的统计函数。这些操作在今后的数据分析中经常会使用到,所以需要熟练掌握并运用。