Python 重塑数据帧并绘制堆叠条形图

Python 重塑数据帧并绘制堆叠条形图,python,pandas,Python,Pandas,我拥有的 我有一个以下样式的框架df,其中每一行代表样本发生的故障: index specimen malfunction 1 'first' 'cracked' 2 'first' 'cracked' 3 'first' 'bent' 4 'second' 'bent' 5 'second' 'bent' 6 'second' 'bent' 7 'second' 'cracked'

我拥有的

我有一个以下样式的框架
df
,其中每一行代表样本发生的故障:

index  specimen   malfunction  
1      'first'    'cracked'
2      'first'    'cracked'
3      'first'    'bent'
4      'second'   'bent'
5      'second'   'bent'
6      'second'   'bent'
7      'second'   'cracked'
8      'third'    'cracked'
9      'third'    'broken'
在真实数据集中,我有大约15个不同的样本和大约10种不同类型的故障

我需要什么

我想绘制一个条形图,表示样本发生了多少故障(因此x轴表示样本标签,y轴表示发生故障的数量)。我需要一个堆叠条形图,以便故障必须按颜色分开

我尝试的


我尝试使用seaborn的
catplot(kind='count')
,如果它能够绘制堆叠图表,这正是我所需要的。不幸的是,它不能,而且我无法想出如何重塑我的数据以使用
pandas.plot.bar(stacked=True)

将分类数据转换为数字:

    import matplotlib.pyplot as plt

    df_toPlot = df #another dataframe keep original data in df

    df_toPlot['mapMal'] = df_toPlot.malfunction.astype("category").cat.codes
这是df_toPlot的印刷品

             index specimen malfunction  mapMal
    0      1    first     cracked       2
    1      2    first     cracked       2
    2      3    first        bent       0
    3      4   second        bent       0
    4      5   second        bent       0
    5      6   second        bent       0
    6      7   second     cracked       2
    7      8    third     cracked       2
    8      9    third      broken       1


    df_toPlot.groupby(['specimen', 'mapMal']).size().unstack().plot(kind='bar', stacked=True)
    plt.show()

第一步是将分类数据转换为数字:

    import matplotlib.pyplot as plt

    df_toPlot = df #another dataframe keep original data in df

    df_toPlot['mapMal'] = df_toPlot.malfunction.astype("category").cat.codes
这是df_toPlot的印刷品

             index specimen malfunction  mapMal
    0      1    first     cracked       2
    1      2    first     cracked       2
    2      3    first        bent       0
    3      4   second        bent       0
    4      5   second        bent       0
    5      6   second        bent       0
    6      7   second     cracked       2
    7      8    third     cracked       2
    8      9    third      broken       1


    df_toPlot.groupby(['specimen', 'mapMal']).size().unstack().plot(kind='bar', stacked=True)
    plt.show()

试试这样的方法:

from matplotlib.pyplot import *
import pandas as pd

df = df.groupby(['specimen', 'malfunction']).count().unstack()
这将生成下表:

结果是这个图表:

试试这样的方法:

from matplotlib.pyplot import *
import pandas as pd

df = df.groupby(['specimen', 'malfunction']).count().unstack()
这将生成下表:

结果是这个图表:

谢谢。事实上,我在这里晚了一点才找到这个答案:所以我的问题有点重复。谢谢。事实上,我在这里晚了一点才找到这个答案:所以我的问题有点重复。