如何高效用日均替换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
相关产品推荐
相关产品推荐

