在这篇文章中,我们将深入探讨如何使用 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 编程助手:“这些数据背后隐藏着什么故事?”