如何在 Pandas 中计算汇总统计数据

在这篇文章中,我们将深入探讨如何使用 Pandas 计算汇总统计数据。这不仅是基础的数据分析技能,更是我们在 2026 年构建 AI 原生数据应用的地基。随着数据规模的爆炸式增长,仅仅知道如何调用 INLINECODEe9d5e163 或 INLINECODEb4b26948 已经不够了。我们需要关注计算的性能、大规模数据下的内存管理,以及如何利用 AI 辅助工具来提升我们的数据探索效率。

使用 describe() 进行描述性统计

describe() 方法是我们进行数据探索的第一步。作为一名经验丰富的开发者,我通常在拿到数据集的第一时间就运行它。它能为我们提供数据的"全景图"。

Python


import pandas as pd
import numpy as np

# 为了模拟真实场景,我们增加了一个包含缺失值的列
d = {‘A‘: [1, 2, 3, 4, 5],
‘B‘: [10, 20, 15, 25, 30],
‘C‘: [1.1, np.nan, 3.5, 4.2, 5.0]}

df = pd.DataFrame(d)

# 使用 describe() 自动计算数值列的汇总统计
# include=‘all‘ 尝试包含所有类型的列
res = df.describe(include=‘all‘)
print(res)

INLINECODEc5bd13f3NaNINLINECODEa059fc5bdescribe()INLINECODE61c5337fcountINLINECODE79955ec1describe()INLINECODE85c6e4e3minINLINECODEe59b9ec6maxINLINECODE72fa52dfdescribe()INLINECODE439d5fa5

import pandas as pd

d = {‘A‘: [1, 2, 3, 4, 5],

‘B‘: [10, 20, 15, 25, 30],

‘D‘: [10, 10, 20, 20, 20]} # 新增众数明显的列

df = pd.DataFrame(d)

使用 skip=False 参数(如果存在 NaN,为了严谨性)

mean_values = df.mean()

median_values = df.median()

计算众数,处理多众数情况

mode_values = df.mode()

print("平均值:

", mean_values)

print("

中位数:

", median_values)

print("

众数 (可能返回多行):

", mode_values)



输出结果

平均值:
 A     3.0
B    20.0
D    16.0
dtype: float64

中位数:
 A     3.0
B    20.0
D    20.0
dtype: float64

众数 (可能返回多行):
      A     B     D
0  1.0  10.0  20.0
1  2.0  15.0   NaN
2  3.0  20.0   NaN
3  4.0  25.0   NaN
4  5.0  30.0   NaN

解释:

请注意 D 列的众数计算结果。不同于 GeeksforGeeks 的简单示例,实际数据中往往不存在单一的众数。INLINECODE01835da5 返回了一个 DataFrame。如果你直接在代码中使用 INLINECODEd28d4bed 来获取众数,在多众数情况下可能会丢失信息。在我们最近的一个项目中,为了保证数据处理的鲁棒性,我们通常会编写一个自定义函数来处理这种情况,或者直接使用多众数中的第一个值作为默认填充项,并记录日志警告。

2026 实战:大数据性能优化与类型优化

我们在上面讨论的示例都只有 5 行数据。但在 2026 年,我们面临的往往是 GB 甚至 TB 级别的日志文件或用户行为数据。如果我们盲目地直接计算,可能会导致内存溢出(OOM)。

让我们思考一下这个场景:你有一个包含 1 亿行数据的 CSV 文件。直接 INLINECODE689a9dcf 然后 INLINECODEa6606956 很可能会让你的笔记本死机。我们可以通过以下方式解决这个问题:

  • 类型优化: 这是降低内存占用最简单且最有效的方法。
  • 分块处理: 对于极大数据集,分块读取并聚合统计量。

Python


import pandas as pd
import numpy as np

# 模拟一个较大的数据集 (100万行)
data = {
‘id‘: np.arange(1, 1000001),
‘score‘: np.random.randint(0, 100, 1000000),
‘category‘: np.random.choice([‘A‘, ‘B‘, ‘C‘, ‘D‘], 1000000)
}
df = pd.DataFrame(data)

print(f"优化前内存占用: {df.memory_usage(deep=True).sum() / 1024**2:.2f} MB")

# 性能优化策略 1: 向下转换数值类型
df[‘id‘] = pd.to_numeric(df[‘id‘], downcast=‘integer‘)
df[‘score‘] = pd.to_numeric(df[‘score‘], downcast=‘integer‘)

# 性能优化策略 2: 将低基数字符串转换为 Category 类型
df[‘category‘] = df[‘category‘].astype(‘category‘)

print(f"优化后内存占用: {df.memory_usage(deep=True).sum() / 1024**2:.2f} MB")

# 此时计算汇总统计会快得多,且占用更少资源
res = df.describe()
print(res.head())

**输出结果**
CODEBLOCK_530068ec

****解释:****
你可能会注意到,内存占用直接下降了 80% 以上。在我们的开发理念中,**数据类型优化是数据工程中最具“性价比”的操作之一**。它不需要改变算法逻辑,仅仅通过告诉 Pandas “这个数字不需要用 64 位浮点数存储,用 8 位整数就行”,就能大幅提升计算速度并减少云服务器的成本。

## 使用 corr() 计算相关性

相关性分析是特征工程中的核心环节。在 2026 年的机器学习工作流中,我们非常看重特征之间的相关性,以去除多重共线性。

Python

import pandas as pd

d = {‘A‘: [1, 2, 3, 4, 5],

‘B‘: [10, 20, 15, 25, 30],

‘C‘: [5, 4, 3, 2, 1]} # C与A是负相关

df = pd.DataFrame(d)

计算皮尔逊相关系数(默认)

method 可以是 ‘pearson‘, ‘kendall‘, ‘spearman‘

res = df.corr(method=‘pearson‘)

print(res)



输出结果

     A         B         C
A  1.000000  0.900000 -1.000000
B  0.900000  1.000000 -0.900000
C -1.000000 -0.900000  1.000000

解释:

corr() 函数计算所有数值列之间的相关系数。系数范围从 -1(强负相关)到 +1(强正相关),0 表示不相关。在这个例子中,A 和 C 完全负相关。在我们构建预测模型时,如果两个特征的相关系数超过 0.95,我们通常会考虑删除其中一个,以防止模型过拟合并减少计算开销。

2026 趋势:AI 辅助数据分析

这可能是本文最关键的部分。仅仅得到统计数据是不够的,我们需要解释这些数据。在现代开发中,我们建议结合 AI Agent 来解读 Pandas 的输出结果。

Agentic AI 工作流示例:

  • 人类: 运行 INLINECODEaca1bd60 和 INLINECODE8ff9eb76。
  • AI Agent (如 Copilot 或自定义脚本): 读取统计结果,自动生成数据质量报告。例如,它可能会提醒你:“A 列的标准差极小,这可能是一个常量特征,建议检查是否存在数据泄露或该特征是否对模型无益。”

在我们最近的一个项目中,我们实现了一个简单的脚本,将 describe() 的输出序列化为 JSON,然后直接发送给 LLM,并询问:“请分析这份摘要,指出数据中可能存在的异常点或需要注意的分布特征。” 这种 LLM 驱动的调试 方法,极大地缩短了我们从“看数据”到“懂数据”的时间。

计算方差和标准差

方差 (INLINECODE561ebe69) 和标准差 (INLINECODE6190c36a) 是衡量数据波动性的关键指标,尤其在金融科技和物联网传感器数据分析中。

Python


import pandas as pd

d = {‘A‘: [1, 2, 3, 4, 5],
‘B‘: [10, 20, 15, 25, 30]}

df = pd.DataFrame(d)

# 使用 ddof=1 (默认,样本标准差)
# 在特定科学计算中可能需要 ddof=0 (总体标准差)
variance_val = df.var(ddof=1)
std_dev_val = df.std(ddof=1)

print(f"方差:
{variance_val}
")
print(f"标准差:
{std_dev_val}")

INLINECODE340a3d7bvar()INLINECODE904be170std()INLINECODEe6fe7c28NaNINLINECODE2d80a5e6skipna=TrueINLINECODE4d5f9a27groupby()INLINECODE30ab8bd8

import pandas as pd

data = {

‘Department‘: [‘HR‘, ‘IT‘, ‘IT‘, ‘HR‘, ‘Finance‘, ‘Finance‘],

‘Employee‘: [‘Alice‘, ‘Bob‘, ‘Charlie‘, ‘David‘, ‘Eve‘, ‘Frank‘],

‘Salary‘: [50000, 80000, 120000, 55000, 90000, 95000]

}

df = pd.DataFrame(data)

我们要计算每个部门的薪资统计

grouped_stats = df.groupby(‘Department‘)[‘Salary‘].agg([

(‘count‘, ‘count‘),

(‘mean_salary‘, ‘mean‘),

(‘std_dev‘, ‘std‘),

(‘min_salary‘, ‘min‘),

(‘max_salary‘, ‘max‘)

])

print(grouped_stats)



输出结果

            count  mean_salary      std_dev  min_salary  max_salary
Department                                                            
Finance          2      92500.0  3535.533906       90000       95000
HR               2      52500.0  3535.533906       50000       55000
IT               2     100000.0  28284.271248       80000      120000

解释:

这展示了 Pandas 的强大之处:INLINECODE9c8f154c 配合 INLINECODEc67dfbe7 (聚合) 允许我们一次性计算多个维度的统计指标。这种方法比写 SQL 循环要高效得多,也更符合 Python 的声明式编程风格。在 2026 年的云端数据仓库(如 Snowflake 或 BigQuery)与 Pandas 交互的场景中,这种语法往往能被翻译器直接优化为高效的查询语句。

计算偏度和峰度

偏度 (INLINECODEbb094f87) 测量数据分布的不对称性,而峰度 (INLINECODE601b4f7b) 测量异常值的存在情况。这在我们检测欺诈或系统异常时非常有用。

Python


import pandas as pd

d = {‘A‘: [1, 2, 3, 4, 5],
‘B‘: [10, 20, 15, 25, 30]}

df = pd.DataFrame(d)

skewness_val = df.skew()
kurtosis_val = df.kurt() # 默认使用 Fisher (正态分布为0)

print(f"偏度:
{skewness_val}
")
print(f"峰度:
{kurtosis_val}")

INLINECODE07d29b28skew()INLINECODE9fcee1c0kurt()INLINECODEa13f5dc6describe()INLINECODE0592bf43mean()INLINECODE4035cc1ecorr()INLINECODE6ec5944adescribe()`,然后问问你的 AI 编程助手:“这些数据背后隐藏着什么故事?”

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/27598.html
点赞
0.00 平均评分 (0% 分数) - 0