基于相同经纬度提取PrpSummed数组并计算月度统计的Pandas求助
解决Pandas按经纬度分组提取数组并添加统计列的问题
嗨,我来帮你搞定这个问题!咱们分步骤来,一步步实现你要的效果:
1. 按经纬度分组提取PrpSummed数组
首先,我们可以通过groupby按Lat和Lon对数据分组,再把每个组的PrpSummed转换成数组,就能得到你需要的arrayPrp:
import pandas as pd import numpy as np # 假设你的原始数据存储在df这个DataFrame里 arrayPrp = df.groupby(['Lat', 'Lon'])['PrpSummed'].apply(np.array).tolist()
这样arrayPrp就是一个列表,每个元素对应一个经纬度点的PrpSummed数值数组,和你预期的结构完全一致。
2. 定义统计运算函数(以SPI为例)
接下来需要实现你的外部统计逻辑,比如计算SPI。这里我先写一个示例函数,你可以替换成自己的实际计算逻辑——注意要保证函数返回的数组长度和输入的分组数组一致,这样才能对应到原数据的每一行:
def calculate_spi(prp_array): # 这里替换成你的真实SPI计算逻辑,示例仅做标准化模拟 mean_val = np.mean(prp_array) std_val = np.std(prp_array) # 返回和输入数组长度一致的统计结果 return (prp_array - mean_val) / std_val
3. 计算统计值并合并回原DataFrame
用groupby的transform方法可以很方便地把统计结果映射回原DataFrame的每一行,自动匹配对应的经纬度分组:
# 对每个经纬度分组应用SPI计算,直接生成新列 df['SPI'] = df.groupby(['Lat', 'Lon'])['PrpSummed'].transform(calculate_spi)
执行完这一步,你的原DataFrame就会新增SPI列,每一行的SPI值都对应其所在经纬度分组的统计结果,和你预期的最终结构完全匹配。
补充:复杂场景的处理方式
如果你的统计运算需要依赖时间序列(比如滑动窗口计算),可以用apply处理每个分组的子DataFrame,灵活性更高:
def process_group(group): # 先确保数据按年份月份排序(如果原始数据没排序的话) group = group.sort_values(['Year', 'Month']) # 在这里执行复杂统计逻辑,比如滚动窗口SPI计算 group['SPI'] = calculate_spi(group['PrpSummed'].values) return group # 按经纬度分组处理,再合并回原结构 df = df.groupby(['Lat', 'Lon'], group_keys=False).apply(process_group)
内容的提问来源于stack exchange,提问作者Darkwilmore
相关产品推荐
相关产品推荐

