使用Pandas求经纬度对对应SPEI均值时仅返回5行结果的问题
解决Pandas按经纬度分组仅返回少量结果的问题
可能的原因及修复方案
1. 经纬度浮点精度差异
浮点数值的微小偏差(比如30.12345和30.1234500001)会被判定为不同分组,导致大量唯一对被拆分。可以通过固定小数位数统一精度:
# 保留4位小数统一经纬度精度 df['lat'] = df['lat'].round(4) df['lon'] = df['lon'].round(4) # 重新分组计算均值 result = df.groupby(['lat', 'lon'], as_index=False)['spei'].mean()
2. 数据存在空值或异常值
若lat/lon/spei列有大量空值,会导致有效分组数量骤降。先排查并处理空值:
# 查看各关键列的空值数量 print(df[['lat', 'lon', 'spei']].isnull().sum()) # 剔除含空值的行(或根据业务需求填充) df_clean = df.dropna(subset=['lat', 'lon', 'spei']) # 重新执行分组计算 result = df_clean.groupby(['lat', 'lon'], as_index=False)['spei'].mean()
3. 分组代码逻辑错误
检查是否误写分组条件,比如仅用单个列分组、或额外添加了过滤条件。确保代码逻辑为:
# 标准分组写法,as_index=False直接生成带列名的DataFrame result = df.groupby(['lat', 'lon'], as_index=False)['spei'].mean()
4. 数据被意外过滤
检查分组前是否有其他数据过滤步骤(比如限定年份、筛选特定区域),导致大部分经纬度对被排除。可以先确认原始数据的唯一经纬度数量:
# 查看原始数据中唯一经纬度对的总数 unique_pairs = df[['lat', 'lon']].drop_duplicates().shape[0] print(f"原始数据共有{unique_pairs}个唯一经纬度对")
若该数值远大于5,说明前面的步骤存在数据过滤遗漏。
5. 版本或内存问题
老版本Pandas处理超大数据集时可能出现分组异常,建议升级到稳定版:
pip install --upgrade pandas
若内存不足导致分组数据丢失,可尝试分块处理:
chunk_size = 100000 result_list = [] # 分块读取并计算分组均值 for chunk in pd.read_csv('your_data.csv', chunksize=chunk_size): chunk['lat'] = chunk['lat'].round(4) chunk['lon'] = chunk['lon'].round(4) chunk_result = chunk.groupby(['lat', 'lon'])['spei'].mean() result_list.append(chunk_result) # 合并分块结果,再次计算全局均值 final_result = pd.concat(result_list).groupby(level=[0,1]).mean().reset_index()
内容的提问来源于stack exchange,提问作者Paskul
相关产品推荐
相关产品推荐

