Как я могу выбрать, какая многоиндексная ось разбивает данные в объекте groupby по различным подсети?

Я работаю с объектом pandas.groupby к которому я применил такую функцию:

x = data.groupby(['congruent', 'contrast']).apply(lambda s: s.mean())[['cresp1', 'cresp2']]

Выход print x:

cresp1 cresp2
congruent contrast 
False 1.0 0.423077 0.442308
 2.0 0.537037 0.481481
 2.5 0.576923 0.634615
 3.0 0.568182 0.500000
 3.5 0.675000 0.750000
 4.0 0.687500 0.604167
 5.0 0.687500 0.875000
 10.0 0.869565 0.913043
True 1.0 0.568182 0.386364
 2.0 0.547619 0.500000
 2.5 0.522727 0.477273
 3.0 0.557692 0.634615
 3.5 0.571429 0.928571
 4.0 0.770833 0.937500
 5.0 0.791667 0.937500
 10.0 0.820000 0.920000

Я хотел бы построить эти данные в два разных подзаголовка: один для всех значений, где congruent == False а другой для всех значений, где congruent == True.

Я пытался делать x.plot(subplots=True), но это создает сюжетные для каждого столбца (т.е. cresp1 против cresp2), который является не то, что я хочу:

Как я могу сделать то, что я пытаюсь сделать?

1 ответ

Вы можете сделать это сами:

import pylab as pl
import io
import pandas as pd

txt = """congruent contrast cresp1 cresp2
False 1.0 0.423077 0.442308
 2.0 0.537037 0.481481
 2.5 0.576923 0.634615
 3.0 0.568182 0.500000
 3.5 0.675000 0.750000
 4.0 0.687500 0.604167
 5.0 0.687500 0.875000
 10.0 0.869565 0.913043
True 1.0 0.568182 0.386364
 2.0 0.547619 0.500000
 2.5 0.522727 0.477273
 3.0 0.557692 0.634615
 3.5 0.571429 0.928571
 4.0 0.770833 0.937500
 5.0 0.791667 0.937500
 10.0 0.820000 0.920000"""

df = pd.read_csv(io.BytesIO(txt), delim_whitespace=True).ffill()
df = df.set_index(["congruent","contrast"])
levels = df.index.levels[0]
fig, axes = pl.subplots(len(levels))

for level, ax in zip(levels, axes):
 df.loc[level].plot(ax=ax, title=str(level))

вывод:

licensed under cc by-sa 3.0 with attribution.