Skip to content

描述性统计

Pandas 的 DataFrame 和 Series 提供了广泛的方法来计算描述性统计(descriptive statistics)。这些方法有助于总结数据集分布的集中趋势(central tendency)、离散度(dispersion)和形状(shape)。

其中大多数是聚合方法(aggregation methods),例如 .sum()、.mean()、.std(),它们将数据归约为单个值或一个 Series。有些方法(例如 .cumsum())则会生成与输入对象大小相同的对象。

许多统计方法接受一个 axis 参数来指定操作方向:

  • axis=0 或 axis='index'(默认):沿行执行操作(对每列聚合行)。
  • axis=1 或 axis='columns':沿列执行操作(对每行聚合列)。

我们来创建一个示例 DataFrame 来演示这些操作:

import pandas as pd
import numpy as np
# 创建一个 Series 字典
data = {
'Name': pd.Series(['Tom', 'James', 'Ricky', 'Vin', 'Steve', 'Smith', 'Jack',
'Lee', 'David', 'Gasper', 'Betina', 'Andres']),
'Age': pd.Series([25, 26, 25, 23, 30, 29, 23, 34, 40, 30, 51, 46]),
'Rating': pd.Series([4.23, 3.24, 3.98, 2.56, 3.20, 4.6, 3.8, 3.78, 2.98, 4.80, 4.10, 3.65])
}
# 创建一个 DataFrame
df = pd.DataFrame(data)
print("Sample DataFrame:")
print(df)

输出:

Sample DataFrame:
Name Age Rating
0 Tom 25 4.23
1 James 26 3.24
2 Ricky 25 3.98
3 Vin 23 2.56
4 Steve 30 3.20
5 Smith 29 4.60
6 Jack 23 3.80
7 Lee 34 3.78
8 David 40 2.98
9 Gasper 30 4.80
10 Betina 51 4.10
11 Andres 46 3.65

计算值的总和。对于数值列,它是算术总和。对于字符串/对象列,它执行字符串连接。

# 沿 axis=0 求和(向下 - 默认)
print("Sum of each column (axis=0):")
print(df.sum())

输出:

Sum of each column (axis=0):
Name TomJamesRickyVinSteveSmithJackLeeDavidGasperBe...
Age 382
Rating 44.92
dtype: object
# 沿 axis=1 求和(横向)
# 这通常需要仅包含数值数据,否则可能导致错误/意外结果
# 我们首先只选择数值列以获得有意义的结果
print("\nSum of each row for numeric columns (axis=1):")
print(df[['Age', 'Rating']].sum(axis=1))

输出:

Sum of each row for numeric columns (axis=1):
0 29.23
1 29.24
2 28.98
3 25.56
4 33.20
5 33.60
6 26.80
7 37.78
8 42.98
9 34.80
10 55.10
11 49.65
dtype: float64

计算数值列的算术平均值(average)。

# 计算数值列的平均值 (axis=0 默认)
print("Mean of numeric columns:")
print(df.mean(numeric_only=True)) # numeric_only=True 避免对非数值列产生警告

输出:

Mean of numeric columns:
Age 31.833333
Rating 3.743333
dtype: float64

计算数值列的样本标准差(standard deviation)(衡量数据离散度)。

# 计算数值列的标准差
print("Standard deviation of numeric columns:")
print(df.std(numeric_only=True))

输出:

Standard deviation of numeric columns:
Age 9.232682
Rating 0.661628
dtype: float64

Pandas 还提供了许多其他统计函数:

函数描述
.count()非 NA/空值的数量
.median()中位数(中间值)
.mode()众数(出现最频繁的值)。如果存在并列,可以返回多个值。
.min()最小值
.max()最大值
.abs()绝对值(用于数值数据)
.prod()值的乘积(用于数值数据)
.cumsum()累计和(返回大小相同的对象)
.cumprod()累计乘积(返回大小相同的对象)
.cummin()累计最小值(返回大小相同的对象)
.cummax()累计最大值(返回大小相同的对象)
.quantile(q=0.5)样本分位数(例如,q=0.5 表示中位数,q=0.25 表示第一四分位数)
.var()样本方差
.skew()样本偏度(衡量不对称性)
.kurt() / .kurtosis()样本峰度(衡量’尾部厚度’)

**注意:**由于 DataFrame 可以包含异构数据(不同列有不同类型),某些函数(如 .abs()、.prod()、.var() 等)只能在数值数据上工作,如果在包含非数值列的 DataFrame 上应用,它们将引发错误或需要设置 numeric_only=True。其他函数如 .count()、.sum() 和 .mode() 可能在非数值数据上工作,但可能产生需要仔细解释的结果(例如 .sum() 对字符串进行连接)。

.describe() 方法非常有用,因为它一次性计算 DataFrame 列的几种常见汇总统计(summary statistics)。默认情况下,它汇总数值列。

# 为数值列生成描述性统计
print("Describe numeric columns:")
print(df.describe())

输出:

Describe numeric columns:
Age Rating
count 12.000000 12.000000
mean 31.833333 3.743333
std 9.232682 0.661628
min 23.000000 2.560000
25% 25.000000 3.230000
50% 29.500000 3.790000
75% 35.500000 4.132500
max 51.000000 4.800000

这提供了计数(count)、均值(mean)、标准差(standard deviation)、最小值(minimum)、最大值(maximum),以及第 25、50(中位数 median)和 75 百分位数(percentiles,即 IQR 的一部分)。

您可以使用 include 和 exclude 参数来控制汇总哪些列类型:

  • include='object':汇总字符串或对象(object)列(计数 count、唯一值 unique、最常见值 top、频率 freq)。
  • include='number':汇总数值列(默认行为)。
  • include='category':汇总分类(categorical)列。
  • include='datetime':汇总日期时间(datetime)列(计数 count、唯一值 unique、第一个 first、最后一个 last)。
  • include='all':尝试汇总所有列(结果中可能包含 NaN,表示该统计量不适用于该列类型)。

示例:汇总对象(字符串)列

# 描述对象列(例如 'Name')
print("\nDescribe object columns:")
print(df.describe(include=['object']))

输出:

Describe object columns:
Name
count 12
unique 12
top Ricky # 如果名字不唯一,Top 值可能会不同
freq 1

示例:汇总所有列

# 描述所有列
print("\nDescribe all columns:")
print(df.describe(include='all'))

输出:

Describe all columns:
Name Age Rating
count 12 12.000000 12.000000
unique 12 NaN NaN
top Ricky NaN NaN
freq 1 NaN NaN
mean NaN 31.833333 3.743333
std NaN 9.232682 0.661628
min NaN 23.000000 2.560000
25% NaN 25.000000 3.230000
50% NaN 29.500000 3.790000
75% NaN 35.500000 4.132500
max NaN 51.000000 4.800000

请注意统计量不适用的地方出现了 NaN 值(例如,合并视图中 ‘Name’ 列的 mean,或数值列的 unique)。