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