Python 这是指未堆叠的数据,然后将其绘制为水平堆叠条形图

Python 这是指未堆叠的数据,然后将其绘制为水平堆叠条形图,python,pandas,matplotlib,Python,Pandas,Matplotlib,我有一个这样的数据集 Category Date Score_1 Score_2 Level A 1/1/2020 130 145 Excellent A 1/5/2020 145 148 Excellent C 1/2/2020 107 109 Need-Improvement B 1/1/2020 125

我有一个这样的数据集

Category    Date    Score_1     Score_2     Level   
A       1/1/2020    130         145     Excellent
A       1/5/2020    145         148     Excellent
C       1/2/2020    107         109     Need-Improvement
B       1/1/2020    125         128     Good
C       1/7/2020    105         107     Need-Improvement
B       1/2/2020    127         117     Good
A       1/12/2020   117         126     Good
C       1/12/2020   123         124     Good
数据集-2

Category    Mean    Excellent(%)  Good(%)   Need-Improvement(%)
A          130.6    66.67         33.33     0
B          126      0             100       0
C          111.6    0             66.67     33.33
我想从dataset1创建一个dataset-2,方法是创建mean from score_1值,创建级别值作为列,并查找每个类别和级别的百分比值。 为此我写了

Df_90=pd.DataFrame()
Df_90["Mean"]=df.groupby('Category')["Score_1"].mean()
Df_90=D_90.reset_index()
这只实现了第一个目标,而没有取消。就这样在下面试过了

df.groupby('Category')["Score_1"].mean().unstack('Level').head()
这引发了一个错误 KeyError:'请求的级别(级别)与索引名称(类别)不匹配'


然后将图形绘制为每个类别的水平条形图,并按级别值以百分比进行堆叠。平均值决定了杆的长度,而堆叠的杆成为其中的水平百分比。

您可以分别聚合平均值和水平频率,然后将它们组合在一起:

mean_score=df.groupby('Category').agg(平均值=('score_1','mean'))
级别\频率=(
df.groupby(['Category']))
['Level'].值\u计数(normalize=True)
穆尔先生(100)
.取消堆叠(填充值=0)
.重命名_轴(列=无)
.add后缀(“()”
)
结果=局部放电浓度([平均得分,频率等级],轴=1)

谢谢,但无法使用result=result.reset_index()result.plot.barh(x=“Category”,y=“Mean”,stacked=True,title='Scores')进行绘图。不确定如何使用level\u frekstacking
Mean进行堆叠,因为这不是性能类别,所以没有意义。您应该只堆叠需要改进/良好/优秀的列:
result.drop(columns='Mean').plot.barh(stacked=True)
是的,您是对的,我希望将level_freq(需要改进/良好/优秀)堆叠起来,但我希望平均值指示条的长度。百分比显示在堆栈中