You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas resample方法SUM与MEAN聚合行为差异原因咨询

重采样聚合时MEAN与SUM行数不同的原因

环境信息

python==3.8.10
pandas==2.0.3 (无法升级到python >= 3.9,因此只能使用该版本)

我有一份年度小时级数据的DataFrame,先过滤移除4月至10月的数据,剩余应为151天,随后按天("1D")进行重采样聚合。

为何MEAN与SUM聚合计算的行数不同?

使用MEAN聚合的代码与结果

import pandas as pd

df = pd.read_parquet(BASE_DIR + "hour_fw_temp2022.parquet")  # 加载小时级数据
df = df[(df.index.month < 4)|(df.index.month > 10)]   # 移除4月至10月的数据
df = df.resample("1D").mean()   # 按天聚合求均值

df.describe()

运行结果:

temp         rh%             fw
count  151.000000  151.000000     151.000000  <=== 均值计算基于151天
mean     3.725442   77.780077   96365.618102
std      4.281750   12.593718   21074.110945
min     -9.304167   25.500000   44666.666667
25%      1.254167   72.125000   82250.000000
50%      3.420833   80.125000  100083.333333
75%      6.814583   85.937500  109395.833333
max     14.091667   98.041667  166333.333333

使用SUM聚合的代码与结果

df = df.resample("1D").sum()   # 按天聚合求和

运行结果:

temp          rh%            fw
count  365.000000   365.000000  3.650000e+02  <== 求和计算基于365天
mean    36.989041   772.260274  9.567918e+05
std     79.347405   940.838631  1.185907e+06
min   -223.300000     0.000000  0.000000e+00  <== 被移除的行被填充为0
25%      0.000000     0.000000  0.000000e+00      所有统计结果都出错了...
50%      0.000000     0.000000  0.000000e+00
75%     53.600000  1849.000000  2.224000e+06
max    338.200000  2353.000000  3.992000e+06

问题原因

这是因为pandas的resample方法对不同聚合函数的缺失时间段处理逻辑不同:

  • mean()聚合:无数据的日期(即过滤掉的4-10月)会返回NaN,df.describe()的count统计会自动忽略NaN,因此只统计有数据的151天。
  • sum()聚合:无数据的日期默认会被填充为0,这些0会被计入df.describe()的统计,所以显示全年365天的结果。

解决方法

若要让sum()聚合也只保留有数据的日期,可采用以下两种方式:

  1. 重采样时添加dropna=True参数(优先推荐):
df = df.resample("1D", dropna=True).sum()
  1. 聚合后过滤值全为0的行(注意:若数据本身存在合法0值,可能误删):
df = df.resample("1D").sum()
df = df[(df != 0).any(axis=1)]

内容的提问来源于stack exchange,提问作者Alex Poca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:07:45