Pandas 数值统计实操:用一份小数据验证分组、窗口与缺失值处理

举报
yd_243677465 发表于 2026/10/27 14:38:46 2026/10/27
【摘要】 用一份模拟收入与成本数据,实操 Pandas 分组聚合、移动窗口、缺失值、交叉表和透视表,记录本地执行结果与统计口径注意事项。

本文由 AI 辅助整理,示例使用人工构造的数据,并已在本地 pandas 3.0.1、NumPy 2.3.5 环境执行验证。本文记录的是 KooLabs 相关学习内容的本地代码练习,不代表已完成云端沙箱资源操作。

学习华为云 KooLabs「Python数据分析-pandas数值统计」时,容易记住一串函数名,却忽略每个结果到底回答什么问题。下面用一份只有八行的模拟数据,把汇总、分组、窗口和缺失值处理串起来。所有金额都是演示用数字,不含任何真实业务或个人信息。

1. 先把问题和数据列对应起来

假设有三个小组,需要比较各组的收入与成本。先建立数据表:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "team": ["A", "B", "B", "A", "C", "C", "B", "A"],
    "revenue": [60, 80, 75, 65, 90, 95, 82, 70],
    "cost": [40, 55, 50, 45, 60, 65, 58, 48],
})
print(df.describe())
print(df["revenue"].agg(["mean", "median", "min", "max", "sum"]))

本次执行得到收入总和 617、均值 77.125、中位数 77.5,最小值 60,最大值 95。这里均值与中位数回答的问题不同:均值关心总体平均水平,中位数关心排序后的中间位置。分析偏斜数据时,两个指标一起看,比只看均值更清楚。

describe() 可以快速检查数值列,但其中的 count 是非空记录数量。若出现缺失值,它不一定等于表的行数。

2. 分组统计前,明确哪些列参与运算

print(df.groupby("team")[["revenue", "cost"]].mean())
print(df.groupby("team").agg(
    revenue_min=("revenue", "min"),
    revenue_mean=("revenue", "mean"),
    total_cost=("cost", "sum"),
))

分组后的收入均值分别为 A 组 65、B 组 79、C 组 92.5。收入的最低值、平均值与成本总额可以在同一个 agg 中生成,并且给结果列起清晰的名字。

这比直接对整张包含字符串的表调用均值更明确。实际数据通常还有订单编号、地区、时间等列,先选择需要统计的数值列,可以避免把标识字段误当作指标。

还要注意:各组样本量不同。此处 A、B 组各三行,C 组两行。比较平均值时,最好同时查看 value_counts() 或分组计数,避免把少量记录的偶然波动理解为稳定优势。

3. 移动窗口开头的 NaN 不一定是数据错误

ts = pd.Series(
    [3, 5, 2, 6, 9, 8, 5, 7, 4, 6],
    index=pd.date_range("2026-10-01", periods=10),
)
print(ts.rolling(window=3).mean())
print(ts.expanding().mean())
print(ts.ewm(span=3).mean())

三条记录的移动平均,前两条为 NaN,因为默认需要凑够一个完整窗口。第三条的结果是 (3 + 5 + 2) / 3,约为 3.333333。这种 NaN 是窗口设置导致的,不代表原始数据缺失。

三种方法适合的问题也不同:rolling 观察固定长度的近期变化;expanding 从第一条一直累计到当前记录;ewm 对历史记录施加不同权重。不要为了让图表开头“好看”,在不理解含义的情况下直接填零。

另外,整数窗口 3 表示三条记录,不必然代表三天。只有像本例这样每天恰好一条记录时,两者才恰好一致;遇到不规则时间序列,要重新确认窗口定义。

4. 缺失值处理需要业务含义

missing = pd.DataFrame({
    "a": [1, 2, np.nan, 4],
    "b": [np.nan, 2, 3, 4],
})
print(missing.count())
print(missing.fillna(0).sum())

本例两列的非空计数都是 3,填零后求和分别为 7 和 9。但“未知”不等于“确实为零”。求和结果可能没有明显变化,平均值、比例和后续模型输入却会改变。实践中应先区分未采集、无适用值、真实零值等情况,再决定保留缺失、删除记录还是填充。

5. 用交叉表与透视表回答不同问题

df["channel"] = [
    "online", "online", "store", "store",
    "online", "store", "online", "store",
]
print(pd.crosstab(df["team"], df["channel"]))
print(df.pivot_table(
    values="revenue", index="team",
    columns="channel", aggfunc="mean",
))

交叉表在这里回答各组不同渠道有多少条记录;透视表则回答各组各渠道的平均收入。例如 B 组线上记录有两条,线上收入均值为 81;线下记录一条,均值为 75。不能把频次表与收入表混用。

本地练习还执行了相关性、协方差、分位数、众数、累计统计、按行统计和条件统计。我的体会是,每次调用统计函数前,先写下三个问题:统计对象是什么、缺失值怎么处理、分组与窗口的边界是什么。函数名容易查询,统计口径才决定结果能否解释。

学习参考:华为云 KooLabs:Python数据分析-pandas数值统计。本文为独立整理的练习说明,使用自建模拟数据与本地运行结果。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。