多行数据的堆积图

Stacked plot of multirow data

我是 pandas 和 matplotlib 的新手,我不确定实现以下目标的正确方法是什么:


我有以下(示例)数据 so_df:

输入:

    import pandas as pd

    so_df = pd.DataFrame({
        "CATEGORY" : ["A", "B", "A", "B"],
        "CONTEXT"  : [ 1 ,  1 ,  0 ,  0],
        "COUNT"    : [100, 111, 50 , 55]
    })
    so_df

输出:

      CATEGORY  CONTEXT  COUNT
    0        A        1    100
    1        B        1    111
    2        A        0     50
    3        B        0     55

现在我想通过 CATEGORYX="CONTEXT" 创建一个带有 y="COUNT" 的 stacked bar-plot。 我知道如何实现这一点的唯一方法是像这样切片和合并:

输入:

    cat_a_df = so_df[so_df["CATEGORY"] == "A"] \
        .rename(columns={"COUNT" : "COUNT A"}) \
        .loc[:,["CONTEXT", "COUNT A"]]

    cat_b_df = so_df[so_df["CATEGORY"] == "B"] \
        .rename(columns={"COUNT" : "COUNT B"}) \
        .loc[:,["CONTEXT", "COUNT B"]]

    stacked_df = cat_a_df.merge(cat_b_df, on="CONTEXT")
    stacked_df

输出:

       CONTEXT  COUNT A  COUNT B
    0        1      100      111
    1        0       50       55

然后照常绘制新数据框:

    stacked_df.plot(kind='bar', stacked=True, x="CONTEXT")
       

output


但是对于看似相当简单的任务,这似乎有点复杂。 有更好的方法吗?

您可以在一行中完成所有操作:

so_df.groupby(['CONTEXT', 'CATEGORY']).sum()['COUNT'].unstack().plot.bar(stacked=True)

我们按 'CONTEXT''CATEGORY' 分组,然后应用 .sum()groupby 对象到数据框 - 在您的情况下,总和不会'不要做任何事。最后我们 unstack 得到一列用于 A 和一列用于 B。绘制这个给出: