我有以下数据框:
land_cover canopy_cat count tc_density_cor
0 20 1 56 35.760967
1 20 2 28 35.760967
2 20 3 11 35.760967
3 20 4 9 35.760967
4 20 5 4 35.760967
5 20 6 3 35.760967
6 20 7 3 35.760967
7 20 8 1 35.760967
8 20 9 4 35.760967
9 20 10 6 35.760967
10 20 11 2 35.760967
11 30 1 194 17.408260
12 30 2 86 17.408260
13 30 3 55 17.408260
14 30 4 36 17.408260
15 30 5 21 17.408260
16 30 6 15 17.408260
17 30 7 9 17.408260
18 30 8 6 17.408260
19 30 9 19 17.408260
20 30 10 14 17.408260
21 30 11 9 17.408260
22 40 1 106 17.458283
23 40 2 45 17.458283
24 40 3 19 17.458283
25 40 4 14 17.458283
26 40 5 9 17.458283
27 40 6 8 17.458283
28 40 7 5 17.458283
29 40 8 5 17.458283
30 40 9 8 17.458283
31 40 10 12 17.458283
32 40 11 3 17.458283
我想将数据绘制为堆积的条形图:
x轴= land_cover
y轴=每个树冠的数量
我认为枢纽功能是我想要的。但是,在我想要相对于“ tc_density_cor”相对于每个land_cover的“计数”列进行规范化之前。
例如,land_cover = 20的“计数”总和=127。
127 / 35.76 = 56 / x->新值应为:15.76
我怎样才能做到这一点?? :)
答案 0 :(得分:1)
IIUC
d = df.set_index(
['land_cover', 'canopy_cat']
).pipe(
lambda d: d['count'].div(d['count'].sum(level=0), axis=0, level=0) * d['tc_density_cor']
).unstack()
d.iloc[:, :5]
canopy_cat 1 2 3 4 5
land_cover
20 15.768615 7.884308 3.097407 2.534242 1.126330
30 7.278454 3.226531 2.063479 1.350641 0.787874
40 7.908453 3.357362 1.417553 1.044513 0.671472
d.plot.bar(stacked=True)
重构相同的答案
def normalize(d):
sums = d['count'].sum(level='land_cover')
return d['count'].div(sums, axis=0, level='land_cover') * d['tc_density_cor']
d = df.set_index(['land_cover', 'canopy_cat']).pipe(normalize).unstack()
d.plot.bar(stacked=True)
答案 1 :(得分:1)