it-swarm.com.de

Boxplot mit Pandas gruppiert

Ok, also habe ich ein Dataframe, das Timeseries-Daten enthält, die für jede Spalte einen mehrzeiligen Index haben. Hier sehen Sie ein Beispiel dafür, wie die Daten aussehen und im CSV-Format vorliegen. Das Laden der Daten ist hier kein Problem.

enter image description here

Ich möchte in der Lage sein, ein Boxplot mit diesen Daten zu erstellen, die nach verschiedenen Kategorien in einer bestimmten Zeile des Multiinex gruppiert sind. Wenn ich beispielsweise nach 'SPECIES' gruppieren würde, hätte ich die Gruppen 'aq', 'gr', 'mix', 'sed' und eine Box für jede Gruppe zu einer bestimmten Zeit in der Timeserie.

Ich habe das probiert:

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

aber es gibt mir einen Boxplot (flache Linie) für jeden Punkt in der Gruppe und nicht für den gruppierten Satz. Gibt es einen einfachen Weg, dies zu tun? Ich habe keine Probleme beim Gruppieren, da ich die Gruppen beliebig zusammenstellen kann, aber ich bin mir nicht sicher, was ich mit diesem Boxplot falsch mache.

Jede Hilfe wäre dankbar.

16
pbreach

Ich glaube, ich habe es herausgefunden, vielleicht wird dies jemandem helfen:

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

Grundsätzlich musste Groupby Output transponiert werden, damit das Boxplot die richtige Gruppierung zeigte:

enter image description here

11
pbreach

dieser Code:

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

Funktioniert nicht, da Boxplot eine Funktion für einen DataFrame und keine Serie ist.

In Pandas> 0.18.1 hat die Boxplot-Funktion das Argument columns, das definiert, aus welcher Spalte die Daten entnommen werden.

So

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

sollte das gewünschte Ergebnis zurückgeben.

Ein Beispiel mit dem Iris-Dataset:

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)

schafft:

 Boxplot iris dataset with pandas

plt.suptitle('') 

schaltet den lästigen automatischen Untertitel aus. Und natürlich akzeptiert Die Spaltenargumente Spaltenlisten ... also 

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

funktioniert auch.

31
schlump

Dies sollte in Version 0.16 funktionieren:

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