web-dev-qa-db-fra.com

Box box avec pandas groupby

Ok, donc j'ai un cadre de données qui contient des données de séries temporelles ayant un index multiligne pour chaque colonne. Voici un exemple de ce à quoi ressemblent les données et au format CSV. Le chargement des données n'est pas un problème ici.

enter image description here

Ce que je veux faire, c'est pouvoir créer une boîte à moustaches avec ces données regroupées selon différentes catégories dans une ligne spécifique du multiinex. Par exemple, si je groupais par "ESPÈCES", j'aurais les groupes "aq", "gr", "mix", "sed" et une case pour chaque groupe à un moment donné de la série chronologique.

J'ai essayé ceci:

grouped = data['2013-08-17'].groupby(axis=1, level='SPECIES')
grouped.boxplot()

mais cela me donne une boîte à moustaches (ligne plate) pour chaque point du groupe plutôt que pour l'ensemble groupé. Y a-t-il un moyen facile de faire ceci? Je n'ai aucun problème à grouper car je peux regrouper les groupes de la manière que je veux, mais je ne suis pas sûr de ce que je fais de mal avec cette boîte à moustaches.

Toute aide serait appréciée.

16
pbreach

Je pense que j'ai compris, peut-être que cela pourrait aider quelqu'un:

grouped = data['2013-08-17'].groupby(axis=1, level='SPECIES').T
grouped.boxplot()

Fondamentalement, la sortie groupby devait être transposée de sorte que la boîte à moustaches présente le bon groupement:

enter image description here

11
pbreach

ce code:

data['2013-08-17'].boxplot(by='SPECIES')

Ne fonctionnera pas, car boxplot est une fonction pour un DataFrame et non une série.

Dans Pandas> 0.18.1, la fonction Boxplot a l'argument columns qui définit à partir de quelle colonne sont extraites les données.

Alors

data.boxplot(column='2013-08-17',by='SPECIES')

devrait renvoyer le résultat souhaité.

Un exemple avec le jeu de données Iris:

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv')
fig, ax = plt.subplots(figsize=(10,8))
plt.suptitle('')
data.boxplot(column=['SepalLength'], by='Name', ax=ax)

crée:

 Boxplot iris dataset with pandas

plt.suptitle('') 

désactive le sous-titre automatique ennuyeux. Et bien sûr, les arguments de colonne acceptent des listes de colonnes ... donc 

data.boxplot(column=['SepalLength', 'SepalWidth'], by='Name', ax=ax)

fonctionne aussi.

31
schlump

Cela devrait fonctionner dans la version 0.16:

data['2013-08-17'].boxplot(by='SPECIES')
0
rafaelvalle