Pandas Groupby Plotting MultiIndex сгруппированы по верхнему уровню - PullRequest
1 голос
/ 11 мая 2019

Я изо всех сил пытаюсь создать многоиндексный сюжет для панд, как я хочу. У меня есть следующий фиктивный кадр данных панд:

data = {
    'Day': [1, 1, 2, 2, 3, 3, 4, 2, 4],
    'Condition': ['A', 'B', 'A', 'A', 'A', 'B', 'B', 'B', 'A'],
    'Invest': [1100, 2002, 500, 200, 1030, 4000, 750, 5000, 320],
    'Spent': [100, 200, 100, 100, 100, 200, 50, 300, 250]
}

index = range(len(data['Day']))

columns = ['Day', 'Condition', 'Invest', 'Spent']

df = pd.DataFrame(data, index=index, columns=columns)

+----+-------+-------------+----------+---------+
|    |   Day | Condition   |   Invest |   Spent |
|----+-------+-------------+----------+---------|
|  0 |     1 | A           |     1100 |     100 |
|  1 |     1 | B           |     2002 |     200 |
|  2 |     2 | A           |      500 |     100 |
|  3 |     2 | A           |      200 |     100 |
|  4 |     3 | A           |     1030 |     100 |
|  5 |     3 | B           |     4000 |     200 |
|  6 |     4 | B           |      750 |      50 |
|  7 |     2 | B           |     5000 |     300 |
|  8 |     4 | A           |      320 |     250 |
+----+-------+-------------+----------+---------+

Я могу получить следующий сюжет, используя:

df.groupby(['Day', 'Condition']).sum()\
   .unstack()\
   .plot(subplots=True, 
    layout=(2,2),
    figsize=(8,6));

enter image description here

Проблема : Я хочу, чтобы результаты A и B были сгруппированы вместе. Например, верхние графики, то есть (Invest, A) и (Invest, B), находятся вместе на одном графике (аналогично для потраченных). Таким образом, у меня было бы только 2 субплота вместо 4 субплотов. У меня есть много примеров здесь в stackoverflow, но все еще не могу заставить его работать. Некоторые предлагали таять и использовать морского рожка, все еще не работало, и я предпочел бы использовать панд.

П.С .: Что я подразумеваю под " Верхний уровень "? Использую ли я правильную терминологию здесь или нет, не уверен, но когда я снимаю стеки сгруппированных панд, в MultiIndex есть различные уровни, я имею в виду группировать график на основе верхнего уровня, как показано ниже:

df.groupby(['Day', 'Condition'])\
   .sum()\
   .unstack()

enter image description here

Ответы [ 2 ]

2 голосов
/ 11 мая 2019

Я бы сделал так:

df=df.groupby(['Day', 'Condition']).sum()\
       .unstack()

df["Invest"].plot(figsize=(8,6), title="Invest")
df["Spent"].plot(figsize=(8,6), title="Spent")

plt.show()

0 голосов
/ 11 мая 2019

Вы можете легко разделить это на две части.

import matplotlib as plt
df1 = df.groupby(['Day', 'Condition']).sum().unstack()

print(df1)

          Invest       Spent     
Condition      A     B     A    B
Day                              
1           1100  2002   100  200
2            700  5000   200  300
3           1030  4000   100  200
4            320   750   250   50

Фильтр df1 для «Инвест» и графика.(Я не знаю, как скопировать вывод диаграммы из jupyter сюда. Извините.)

df1.loc[:,('Invest', slice(None))].plot(subplots=True, 
    layout=(1,2),
    figsize=(10,4));

Теперь фильтр для 'Потрачено'

df1.loc[:,('Spent', slice(None))].plot(subplots=True, 
    layout=(1,2),
    figsize=(10,4));
...