如何通过函数按条件计算多维度季节性求和?
更简洁的实现方案
可以利用Pandas的分箱、映射、分组聚合能力,一次性完成所有计算,避免繁琐的逐块拆分:
步骤说明
- 筛选夏季数据:提取日期中的年份和月份,只保留6-8月的记录
- 纬度区间分箱:用
pd.cut将latitude直接划分为指定的三个区间 - 生成加权count:通过字典映射region到对应系数,计算
count * 系数 - 分组聚合重塑:按年份和纬度区间分组求和,最后转成目标格式的DataFrame
完整代码
import pandas as pd import numpy as np # 测试数据生成 df_test = pd.DataFrame({ 'date': pd.date_range('2019-01-01', '2021-12-31', periods=360), 'latitude': np.linspace(50, 90, 360), 'region': ['land', 'ocean', 'coast'] * 120, 'count': [1, 2, 3] * 120, }) df_test['date'] = pd.to_datetime(df_test['date']) # 1. 提取年份和月份,筛选夏季(6-8月)数据 df_test['year'] = df_test['date'].dt.year summer_mask = df_test['date'].dt.month.isin([6,7,8]) df_summer = df_test[summer_mask] # 2. 对latitude进行分箱,指定区间和标签 lat_bins = [60,70,80,90] lat_labels = ['60-70', '70-80', '80-90'] df_summer['lat_interval'] = pd.cut(df_summer['latitude'], bins=lat_bins, labels=lat_labels, include_lowest=True) # 3. 映射region到系数,计算加权count region_coeff = {'land':2, 'ocean':4, 'coast':8} df_summer['weighted_count'] = df_summer['count'] * df_summer['region'].map(region_coeff) # 4. 分组求和并重塑为目标格式 result = df_summer.groupby(['year', 'lat_interval'])['weighted_count'].sum().unstack() # 调整索引/列名称(可选,让结果更贴合需求) result.index.name = None result.columns.name = None print(result)
代码优势
- 避免了重复的子集拆分和逐块计算,代码更简洁易维护
- 利用Pandas内置的向量化操作,计算效率更高(尤其是大数据集)
- 自动处理所有年份和区间的组合,无需手动逐个拼接结果
内容的提问来源于stack exchange,提问作者zxdawn
相关产品推荐
相关产品推荐

