Cuadro de caja agrupado con marinero

Tengo los siguientes datos en python panda DataFrame. Me gustaría tener un diagtwig de caja agrupado similar a uno en https://stanford.edu/~mwaskom/software/seaborn/examples/grouped_boxplot.html

Para cada ID, me gustaría tener dos diagtwigs de caja trazados lado a lado. Cómo logro esto. Intenté trazarlo con el paquete marítimo pero sin ningún éxito.

id predicted real 1 [10, 10, 10] [16, 18, 20] 2 [12, 12, 15] [15, 17, 19, 21, 23] 3 [20, 5, 4, 4] [29, 32] 4 [25, 25, 25, 24, 21] [21, 24, 25, 26, 28, 29, 30, 33] 5 [20, 20, 20, 21] [21, 22, 24, 26, 28, 30, 31, 32] 6 [8, 3, 3, 14] [25, 27] 7 [1, 4, 4, 4, 5, 6, 10] [69, 71, 72] 8 [11, 11, 11, 11] [19, 21, 22, 23, 24] 9 [7, 6, 9, 9] [19, 26, 27, 28] 10 [30, 30, 30, 30, 30] [38, 39] 

Observe la estructura de la tabla en el ejemplo que está mirando

 import seaborn as sns tips = sns.load_dataset("tips") sns.boxplot(x="day", y="total_bill", hue="sex", data=tips, palette="PRGn") sns.despine(offset=10, trim=True) 

introduzca la descripción de la imagen aquí

 tips.head() 

introduzca la descripción de la imagen aquí


Nuestro objective es configurar tu mesa como esta.

Preparar

 from StringIO import StringIO import pandas as pd text = """id predicted real 1 [10, 10, 10] [16, 18, 20] 2 [12, 12, 15] [15, 17, 19, 21, 23] 3 [20, 5, 4, 4] [29, 32] 4 [25, 25, 25, 24, 21] [21, 24, 25, 26, 28, 29, 30, 33] 5 [20, 20, 20, 21] [21, 22, 24, 26, 28, 30, 31, 32] 6 [8, 3, 3, 14] [25, 27] 7 [1, 4, 4, 4, 5, 6, 10] [69, 71, 72] 8 [11, 11, 11, 11] [19, 21, 22, 23, 24] 9 [7, 6, 9, 9] [19, 26, 27, 28] 10 [30, 30, 30, 30, 30] [38, 39]""" df = pd.read_csv(StringIO(text), sep='\s{2,}', engine='python', index_col=0) df = df.stack().str.strip('[]') \ .str.split(', ').unstack() df 

introduzca la descripción de la imagen aquí


Consigue tu mesa en el formato correcto.

 df1 = df.stack().apply(pd.Series).stack().astype(int) \ .rename_axis(['id', 'reality', None]) \ .rename('value').reset_index(['id', 'reality']) \ .reset_index(drop=True) df1.head() 

introduzca la descripción de la imagen aquí

 sns.boxplot(x='id', y='value', hue='reality', data=df1, palette='PRGn') sns.despine(offset=10, trim=True) 

introduzca la descripción de la imagen aquí