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

如何高效用日均替换DataFrame缺失PRCP值并计算年度总和?

高效替换缺失值并计算年度降水总和

问题背景

现有如下结构的DataFrame,其中PRCP列的缺失值标记为-9999:

DATE  PRCP
0     1949-01-01    25
1     1949-01-02     5
2     1949-01-03     0
3     1949-01-04     0
4     1949-01-05     0
...          ...   ...
20952 2016-01-27     0
20953 2016-01-28     0
20954 2016-01-29    76
20955 2016-01-30     3
20956 2016-01-31     0

已通过以下代码生成了各月-日对应的PRCP均值Series:

daily_mean = df[df['PRCP'] != -9999].groupby(df['DATE'].dt.strftime('%m-%d'))['PRCP'].mean()

该Series结构如下:

DATE
01-01    32.481481
01-02    37.703704
01-03    21.557692
01-04    30.230769
01-05    30.250000
           ...    
12-27    22.980769
12-28    54.076923
12-29    42.685185
12-30    25.553571
12-31    15.000000
Name: PRCP, Length: 366, dtype: float64

需要将原DataFrame中PRCP列的-9999替换为对应日期的均值,进而计算年度PRCP总和,替代现有循环遍历的低效方法。

高效实现方案

步骤1:生成统一格式的月-日标识列

先给原DataFrame添加一列month_day,格式与daily_mean的索引一致:

df['month_day'] = df['DATE'].dt.strftime('%m-%d')

步骤2:批量替换缺失值

利用布尔索引结合map方法,直接对缺失值进行批量替换,避免循环:

# 定位PRCP为-9999的行,用对应month_day的均值替换
df.loc[df['PRCP'] == -9999, 'PRCP'] = df.loc[df['PRCP'] == -9999, 'month_day'].map(daily_mean)

步骤3:计算年度总和

完成替换后,直接按年份分组求和:

prcp_sum_year = df.groupby(df['DATE'].dt.year)['PRCP'].sum()

简化版(合并步骤)

如果不需要保留month_day列,可以直接在替换时生成标识,一步完成:

# 直接生成月-日标识并映射替换缺失值
df.loc[df['PRCP'] == -9999, 'PRCP'] = df.loc[df['PRCP'] == -9999, 'DATE'].dt.strftime('%m-%d').map(daily_mean)

# 计算年度总和
prcp_sum_year = df.groupby(df['DATE'].dt.year)['PRCP'].sum()

方案优势

  • 完全避免循环遍历,利用Pandas的向量化操作,处理大数据集时效率提升显著
  • 代码简洁易读,逻辑清晰,维护成本低

内容的提问来源于stack exchange,提问作者Arbel Hadari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:42:48