Построение групповых групп Pandas с использованием подзаголовков и цикла

Я пытаюсь создать сетку подзаголовков на основе объекта Pandas groupby. Я хотел бы, чтобы каждый график был основан на двух столбцах данных для одной группы объекта groupby. Набор поддельных данных:

C1,C2,C3,C4
1,12,125,25
2,13,25,25
3,15,98,25
4,12,77,25
5,15,889,25
6,13,56,25
7,12,256,25
8,12,158,25
9,13,158,25
10,15,1366,25

Я пробовал следующий код:

import pandas as pd
import csv   
import matplotlib as mpl
import matplotlib.pyplot as plt
import math

#Path to CSV File
path = "..\\fake_data.csv"

#Read CSV into pandas DataFrame
df = pd.read_csv(path)

#GroupBy C2
grouped = df.groupby('C2')

#Figure out number of rows needed for 2 column grid plot
#Also accounts for odd number of plots
nrows = int(math.ceil(len(grouped)/2.))

#Setup Subplots
fig, axs = plt.subplots(nrows,2)

for ax in axs.flatten():
    for i,j in grouped:
        j.plot(x='C1',y='C3', ax=ax)

plt.savefig("plot.png")

Но он генерирует 4 идентичных подзаголовка со всеми данными, нанесенными на каждый (см. Пример вывода ниже):

введите описание изображения здесь

Чтобы исправить это, я хотел бы сделать что-то вроде следующего:

for i,j in grouped:
    j.plot(x='C1',y='C3',ax=axs)
    next(axs)

но я получаю эту ошибку

AttributeError: объект 'numpy.ndarray' не имеет атрибута 'get_figure'

У меня будет динамическое количество групп в объекте groupby, который я хочу построить, и намного больше элементов, чем предоставленные мною фальшивые данные. Вот почему мне нужно элегантное, динамическое решение, и каждый набор данных группы отображается на отдельном подзаголовке.


person fireitup    schedule 21.05.2015    source источник


Ответы (1)


Похоже, вы хотите перебирать группы и оси параллельно, поэтому вместо того, чтобы иметь вложенные for циклы (которые перебирают все группы для каждой оси), вам нужно что-то нравится:

for (name, df), ax in zip(grouped, axs.flat):
    df.plot(x='C1',y='C3', ax=ax)

введите описание изображения здесь

У вас есть правильная идея во втором фрагменте кода, но вы получаете сообщение об ошибке, потому что axs - это массив осей, но plot ожидает только одну ось. Таким образом, следует также заменить next(axs) в вашем примере на ax = axs.next() и изменить аргумент plot на ax=ax.

person mcwitt    schedule 21.05.2015