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数值统计。本文为独立整理的练习说明,使用自建模拟数据与本地运行结果。
- 点赞
- 收藏
- 关注作者
评论(0)