使用 python/ pandas 将数据归一化并绘制为堆积条形图
normalize data and plot as stacked bar plot with python/ pandas
我有以下数据框:
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 轴 = 每个 canopy_cat
的计数
我认为枢轴函数正是我要找的。但是,在我想相对于 "tc_density_cor" 规范化每个 land_cover 的 "count" 列之前。
例如,"counts" 的总和为 land_cover=20 = 127。
127/35.76 = 56/x --> 新值将是:15.76
我怎样才能做到这一点?? :)
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)
我认为你需要:
df['Count Per Canopy Cat'] = (df['count'] * df['tc_density_cor'] /
df.groupby('land_cover')['count'].transform(sum))
df.pivot('land_cover',
'canopy_cat',
'Count Per Canopy Cat')\
.plot.bar(stacked=True, figsize=(15,8))
图表:
我有以下数据框:
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 轴 = 每个 canopy_cat
的计数
我认为枢轴函数正是我要找的。但是,在我想相对于 "tc_density_cor" 规范化每个 land_cover 的 "count" 列之前。
例如,"counts" 的总和为 land_cover=20 = 127。
127/35.76 = 56/x --> 新值将是:15.76
我怎样才能做到这一点?? :)
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)
我认为你需要:
df['Count Per Canopy Cat'] = (df['count'] * df['tc_density_cor'] /
df.groupby('land_cover')['count'].transform(sum))
df.pivot('land_cover',
'canopy_cat',
'Count Per Canopy Cat')\
.plot.bar(stacked=True, figsize=(15,8))
图表: