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()聚合也只保留有数据的日期,可采用以下两种方式:
- 重采样时添加
dropna=True参数(优先推荐):
df = df.resample("1D", dropna=True).sum()
- 聚合后过滤值全为0的行(注意:若数据本身存在合法0值,可能误删):
df = df.resample("1D").sum() df = df[(df != 0).any(axis=1)]
内容的提问来源于stack exchange,提问作者Alex Poca
相关产品推荐
相关产品推荐

