多行数据的堆积图

时间:2018-09-12 15:57:04

标签: python pandas stacked-chart

我对pandas和matplotlib相当陌生,我不确定实现以下目标的正确方法:


我有以下(示例)数据so_df

IN:

    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

OUT:

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

现在,我想用y="COUNT"CATEGORY的{​​{1}}创建一个stacked bar-plot。 我知道如何实现这一目标的唯一方法是像这样进行切片和合并:

IN:

X="CONTEXT"

OUT:

    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

output


但是对于看起来很简单的任务来说,这似乎变得很复杂。 有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

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

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

我们将'CONTEXT''CATEGORY'分组,然后应用.sum()groupby对象获取数据框-在您的情况下,总和不会任何东西。最后,我们unstackA得到一列,为B得到一列。绘制此图可得出:

enter image description here