He obtenido un agregado en la siguiente forma:

                                                        measure
                                                            mean
attribute dataset_name                          method            
50      d111                                  m1        0.559120
                                              m2        0.632573
                                              m3        0.555867
                                              m4        0.587053
                                              m5        0.647413
        d222                                  m1        0.759120
                                              m2        0.632573
                                              m3        0.655867
                                              m4        0.584053
                                              m5        0.647413
        d333                                  m1        0.859120
                                              m2        0.632573
                                              m3        0.655867
                                              m4        0.587053
                                              m5        0.647413

Mi objetivo es trazar estos datos de la siguiente manera:

x axis = attribute

y axis = mean

hue = method

facet_wrap = dataset_name

Parece que no puedo hacer que esto funcione con pandas + seaborn library. Principalmente tengo problemas para obtener esta tabla en una versión fundida, basada en dataset_name, método y atributo.

¡Gracias!

1
sdgaw erzswer 2 mar. 2018 a las 12:07

3 respuestas

La mejor respuesta

Creo que necesito seleccionar la columna measure para evitar MultiIndex y luego reset_index:

print (df.reset_index().columns)
MultiIndex(levels=[['measure', 'method', 'dataset_name', 'attribute'], ['mean', '']],
           labels=[[3, 2, 1, 0], [1, 1, 1, 0]])

df1 = df['measure'].reset_index()
print (df1)
    attribute dataset_name method      mean
0          50         d111     m1  0.559120
1          50         d111     m2  0.632573
2          50         d111     m3  0.555867
3          50         d111     m4  0.587053
4          50         d111     m5  0.647413
5          50         d222     m1  0.759120
6          50         d222     m2  0.632573
7          50         d222     m3  0.655867
8          50         d222     m4  0.584053
9          50         d222     m5  0.647413
10         50         d333     m1  0.859120
11         50         d333     m2  0.632573
12         50         d333     m3  0.655867
13         50         d333     m4  0.587053
14         50         d333     m5  0.647413

print (df1.columns)
Index(['attribute', 'dataset_name', 'method', 'mean'], dtype='object')

Y para la trama, use Manish Saraswat' answer.

1
jezrael 2 mar. 2018 a las 09:39

Agregando a la respuesta @jezrael, esto es para el complot:

g = sns.FacetGrid(df, col='dataset_name', hue='method',size = 7, aspect = 1.0)
(g.map(plt.scatter, 'attribute','mean').set_titles("{col_name} Dataset").add_legend())

# output plot

enter image description here

2
YOLO 2 mar. 2018 a las 09:42

Logré resolver esto simplemente haciendo:

df_new = df.reset_index()

Si hay alguna forma más elegante, me alegraría saberlo.

0
sdgaw erzswer 2 mar. 2018 a las 09:21