描述性统计
Pandas - 描述性统计
Section titled “Pandas - 描述性统计”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 pdimport 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])}
# 创建一个 DataFramedf = pd.DataFrame(data)
print("Sample DataFrame:")print(df)输出:
Sample DataFrame: Name Age Rating0 Tom 25 4.231 James 26 3.242 Ricky 25 3.983 Vin 23 2.564 Steve 30 3.205 Smith 29 4.606 Jack 23 3.807 Lee 34 3.788 David 40 2.989 Gasper 30 4.8010 Betina 51 4.1011 Andres 46 3.65常用聚合方法
Section titled “常用聚合方法”.sum()
Section titled “.sum()”计算值的总和。对于数值列,它是算术总和。对于字符串/对象列,它执行字符串连接。
# 沿 axis=0 求和(向下 - 默认)print("Sum of each column (axis=0):")print(df.sum())输出:
Sum of each column (axis=0):Name TomJamesRickyVinSteveSmithJackLeeDavidGasperBe...Age 382Rating 44.92dtype: 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.231 29.242 28.983 25.564 33.205 33.606 26.807 37.788 42.989 34.8010 55.1011 49.65dtype: float64.mean()
Section titled “.mean()”计算数值列的算术平均值(average)。
# 计算数值列的平均值 (axis=0 默认)print("Mean of numeric columns:")print(df.mean(numeric_only=True)) # numeric_only=True 避免对非数值列产生警告输出:
Mean of numeric columns:Age 31.833333Rating 3.743333dtype: float64.std()
Section titled “.std()”计算数值列的样本标准差(standard deviation)(衡量数据离散度)。
# 计算数值列的标准差print("Standard deviation of numeric columns:")print(df.std(numeric_only=True))输出:
Standard deviation of numeric columns:Age 9.232682Rating 0.661628dtype: float64其他有用的描述性函数
Section titled “其他有用的描述性函数”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()
Section titled “汇总数据:.describe()”.describe() 方法非常有用,因为它一次性计算 DataFrame 列的几种常见汇总统计(summary statistics)。默认情况下,它汇总数值列。
# 为数值列生成描述性统计print("Describe numeric columns:")print(df.describe())输出:
Describe numeric columns: Age Ratingcount 12.000000 12.000000mean 31.833333 3.743333std 9.232682 0.661628min 23.000000 2.56000025% 25.000000 3.23000050% 29.500000 3.79000075% 35.500000 4.132500max 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: Namecount 12unique 12top Ricky # 如果名字不唯一,Top 值可能会不同freq 1示例:汇总所有列
# 描述所有列print("\nDescribe all columns:")print(df.describe(include='all'))输出:
Describe all columns: Name Age Ratingcount 12 12.000000 12.000000unique 12 NaN NaNtop Ricky NaN NaNfreq 1 NaN NaNmean NaN 31.833333 3.743333std NaN 9.232682 0.661628min NaN 23.000000 2.56000025% NaN 25.000000 3.23000050% NaN 29.500000 3.79000075% NaN 35.500000 4.132500max NaN 51.000000 4.800000请注意统计量不适用的地方出现了 NaN 值(例如,合并视图中 ‘Name’ 列的 mean,或数值列的 unique)。