Сложенный график многострочных данных - PullRequest
0 голосов
/ 12 сентября 2018

Я довольно новичок в 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 и X="CONTEXT".Единственный способ, которым я знаю, как этого добиться, это нарезать и объединять так:

IN:

    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

OUT:

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

И затем построить новыйобычный кадр данных:

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

output


Но это кажется слишком сложным для того, что кажется довольно простой задачей.Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете сделать все это в одной строке:

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

Мы группируем по 'CONTEXT' и 'CATEGORY ', затем применяем .sum(), чтобы получить от объекта groupby к фрейму данных - в вашем случае сумма ничего не изменит. Наконец, мы unstack получаем один столбец для A и один столбец для B. Построение этого дает:

enter image description here

...