pandas groupby调用mean()计算均值时结果出现inf值如何解决
异常成因
你之前排查0值属于方向错误,该异常和0值没有关联,核心原因有两点:
- 参与计算的原始数据存在脏值:部分行的Latitude、Longitude字段被解析为浮点数无穷值(
np.inf/-np.inf),这类值不属于0,常规排查很容易遗漏。pandas分组时会将经纬度同为inf的记录聚合为单独一组,就出现了结果最后一行经纬度均为inf的异常记录。 - 结果行数少于预期的原因是pandas
groupby的默认机制:当分组键(也就是这里的Latitude、Longitude)为空值NaN时,对应行会被直接排除在聚合结果外,不会参与计算。你看到的行数差,就是经纬度被解析为NaN的格点被丢弃导致的。
另外你代码里as_index=False后再接.reset_index()属于冗余写法,as_index=False已经不会将分组键设置为索引,该写法不会引发计算错误,但没有必要。
解决方法
按以下步骤排查修复即可:
- 先定位异常数据源,在分组前执行以下代码,筛出所有经纬度为非有限值(包含NaN、inf、-inf)的记录,直接定位是哪个源文件、哪部分数据出了问题:
import numpy as np # 筛选经纬度无效的异常行 error_rows = df_00_10[ (~np.isfinite(df_00_10['Latitude'])) | (~np.isfinite(df_00_10['Longitude'])) ] # 统计异常行来自哪些文件 print(error_rows['filename'].value_counts())
- 根据定位到的异常来源修正数据读入逻辑:如果是CSV文件末尾存在多余尾注、空行、错位表头导致的解析错误,在使用
pd.read_csv()读入文件时添加skipfooter、skiprows参数跳过无效行即可;如果是个别格点经纬度解析错误,由于你明确所有数据集的经纬度格网完全一致,可以直接用一份确认无异常的经纬度列,覆盖所有读入文件的对应字段,从根源避免解析偏差。 - 聚合前增加一层有效数据过滤,避免异常值进入计算流程,修正后的参考代码如下:
import numpy as np import pandas as pd def Timeseries(dfn): # 先过滤经纬度为非有限值的无效行 df_valid = dfn[ np.isfinite(dfn['Latitude']) & np.isfinite(dfn['Longitude']) ] # 筛选目标年份文件 df_00_10 = df_valid.loc[df_valid['filename'].isin([ '1964_12_O18grid.csv','1965_12_O18grid.csv', '1967_12_O18grid.csv','1968_12_O18grid.csv', '1969_12_O18grid.csv' ])] # 分组计算均值,移除冗余的reset_index dfalT = df_00_10.groupby(['Latitude', 'Longitude'], as_index=False)['Value'].mean() return dfalT
计算完成后校验结果行数为64801、不存在inf/NaN的经纬度记录,即为符合预期的结果。
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

