如何按站点分组对DataFrame多年观测数据进行线性插值?
问题原因与解决方案
核心问题
你的代码未生效主要有两个潜在原因:
- pandas内置的
interpolate()方法默认仅对NaN类型的缺失值执行插值,你数据中的缺失值被标记为0,不会被识别为待填充的缺失值 - 你的代码中分组使用的列名为
stations,但从数据样例来看,站点列的实际列名为station,拼写不一致会导致分组报错或失效
修复步骤
1. 替换缺失值标识
先将数据中代表缺失的0替换为pandas可识别的缺失值类型:
import pandas as pd # 若你的业务中真实观测值存在0,可调整替换逻辑,仅替换连续出现的异常0 df['observations'] = df['observations'].replace(0, pd.NA)
2. 按站点分组执行插值
修正列名并使用apply确保每个站点的序列独立插值:
df['interpolated_obs'] = df.groupby('station', group_keys=False)['observations'].apply( lambda x: x.interpolate(method='linear') )
可选参数调整
如果需要限制连续缺失值的插值长度,避免过长连续缺测时的插值结果失真,可以添加limit参数:
# 示例:最多插值连续3个缺失值,超过3个的连续缺失保留NaN df['interpolated_obs'] = df.groupby('station', group_keys=False)['observations'].apply( lambda x: x.interpolate(method='linear', limit=3) )
内容的提问来源于stack exchange,提问作者GeoBeez
相关产品推荐
相关产品推荐

