Raster - 计算 rasterstack 中每个类别的像素并使用 python 写入数据帧
Raster - count pixel per category in rasterstack and write in dataframe with python
我有一个包含 94 个波段的栅格堆栈。
栅格中的像素值在 1-30 之间变化,代表光谱类别。
带代表日期。
现在我想为每个波段计算每个 class 中的像素数。
例如波段 1 有 200 像素的类别 1 和 300 像素的类别 23 等等...
在论坛里我找到了一些相关的答案,所以我用下面的代码来计算像素:
raster = gdal.Open(data)
# empty dicionary
mydic = {"klasse":[],"count":[]}
# count pixel per catgory for each band and write it to a dictionary
for band in range(1, bands+1):
data = raster.GetRasterBand(band).ReadAsArray().astype('float')
data = data[~np.isnan(data)] # remove nan values
uni = np.unique(data,return_counts=True) #count unique values
mydic["klasse"].append(uni[0])
mydic["count"].append(uni[1])
# make a dataframe from the dictionary
df = pd.DataFrame.from_dict(mydic)
得到的和我需要的差不多,只是输出格式不一样而已。
我明白了:
但我想要这样的东西:
任何提示如果可能的话如何做?
谢谢!
一种方法是尝试 explode
:
df = pd.DataFrame(mydic)
(pd.DataFrame({c:df[c].explode() for c in mydic})
.set_index('klasse', append=True)['count']
.unstack(fill_value=0)
)
输出:
klasse 1 3 4 6 7 8 25 27
0 77 358 0 0 138 4 0 0
1 0 0 0 0 0 0 577 0
2 365 114 23 35 5 0 0 35
我有一个包含 94 个波段的栅格堆栈。
栅格中的像素值在 1-30 之间变化,代表光谱类别。
带代表日期。
现在我想为每个波段计算每个 class 中的像素数。
例如波段 1 有 200 像素的类别 1 和 300 像素的类别 23 等等...
在论坛里我找到了一些相关的答案,所以我用下面的代码来计算像素:
raster = gdal.Open(data)
# empty dicionary
mydic = {"klasse":[],"count":[]}
# count pixel per catgory for each band and write it to a dictionary
for band in range(1, bands+1):
data = raster.GetRasterBand(band).ReadAsArray().astype('float')
data = data[~np.isnan(data)] # remove nan values
uni = np.unique(data,return_counts=True) #count unique values
mydic["klasse"].append(uni[0])
mydic["count"].append(uni[1])
# make a dataframe from the dictionary
df = pd.DataFrame.from_dict(mydic)
得到的和我需要的差不多,只是输出格式不一样而已。 我明白了:
但我想要这样的东西:
任何提示如果可能的话如何做? 谢谢!
一种方法是尝试 explode
:
df = pd.DataFrame(mydic)
(pd.DataFrame({c:df[c].explode() for c in mydic})
.set_index('klasse', append=True)['count']
.unstack(fill_value=0)
)
输出:
klasse 1 3 4 6 7 8 25 27
0 77 358 0 0 138 4 0 0
1 0 0 0 0 0 0 577 0
2 365 114 23 35 5 0 0 35