作为大气遥感的一员,研究的对象主要是排放栅格图像,因此本文主要针对栅格图像来对其NaN空值进行有选择的填补。

在处理数据时遇到一个问题:当一个栅格图像只有很小一部分存在有用值。可能10000多个栅格区域只有300个有有效值,此背景下给一个假设:如果300个有效值能够表征此区域的特征,那么就想用这300个有用值来随机填补其他其余10000多个的空值,得到我该如何用python进行实现呢。

查了很多,提及的内容均是使用单一值(1或者0或者符号)或者特定值(前值或后值)进行一个简单的填补,但是没有了数据范围的可靠性和随机填补的随机性,这些内容对于复杂一些的数据处理都是没有意义的,因此想在此分析自己的想法思路,能为地理测绘或相关学科的人带来帮助也就再好不过了。

将栅格图像值转为dataframe的过程我就不作阐释了,仅仅是一系列的数据格式转换,我想到的办法是构建两个dataframe,data1与data2,假设data1和data2的栅格数据范围都是156(lon)*96(lat)=14976个栅格值变成dataframe也就是14976行,data1是其有效值(去除NAN),data2则是所有14976个值(包括NAN和有效值)。

#------------读取数据并展平为列表(分为两类:去除NAN值和没有去除NAN值)------------#

a1 = np.array(a1_3D_xr[m]).flatten() #读取每个月的系数并展平为列表

a1_1 = a1[np.logical_not(np.isnan(a1))].tolist() #删除NAN值,为构建data1做准备

a1_2 = a1.tolist() #未去除NAN值,为构建data2做准备

#--将展平的列表制作为两个dataframe: data1(删除NAN值的A1部分),data2(有值和无值部分A=A1+A2--#

data1 = {'a1': a1_1}

df1 = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in data1.items()]))

df1.index.name = 'Grid'

data2 = {'a1': a1_2}

df2 = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in data2.items()]))

df2.index.name = 'Grid'

print(df1)

print(df2)

输出结果:df1和df2

得到了df1和df2,用df1来填补df2,可以看到在df1中有331个有效值,也就是说df2也有331行值是有效的,因此我在df1中随机选择14976个值(注意是14976,而不是14976-331=14645个值),一开始我天真的以为filna函数会对df2的NAN值自动进行填补,其实并不是,而是按照顺序,从0开始一直下去,有值的跳过,没值的填补,因此这边还是使用14976个值才会对df2所有空值起到填补作用,并且也不会影响df2的原有值。

#-------A有96*156=14976的栅格值,因此对A1进行14976次随机选择填补除A1以外的所有值----------#

df_i = df1.sample(n=14976,replace=True,axis=0) #在df1中随机选取14976个值

df_i = df_i.reset_index(drop=True) #注意对选取的值要进行重新排列,方便按照索引一一对应填入df2

df_i.index.name = 'Grid'

df2['a1'] = df2['a1'].fillna(df_i['a1']) #填入df2

print(df2)

 输出结果:填补完成的df2

 最后对df2进行reshape和格式转换就可以得到栅格数据进行下一步数据分析等等实验步骤了。

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: