深入浅出Pandas:利用Python进行数据处理与分析
上QQ阅读APP看书,第一时间看更新

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 小结

数据统计是数据分析的最基本操作,本节介绍了数据的描述性统计、数学统计及一些常用的统计函数。这些操作在今后的数据分析中经常会使用到,所以需要熟练掌握并运用。