web-dev-qa-db-ja.com

pandas groupbyを使用した箱ひげ図

わかりましたので、各列の複数行インデックスを持つ時​​系列データを含むデータフレームがあります。以下はデータがどのように見えるかのサンプルで、csv形式です。ここでは、データの読み込みは問題ではありません。

enter image description here

私がやりたいのは、multiinexの特定の行のさまざまなカテゴリに従ってグループ化されたこのデータで箱ひげ図を作成できるようにすることです。たとえば、「SPECIES」でグループ化する場合、グループ「aq」、「gr」、「mix」、「sed」、および時系列の特定の時間の各グループのボックスがあります。

私はこれを試しました:

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

しかし、グループ化されたセットではなく、グループ内の各ポイントの箱ひげ図(フラットライン)が表示されます。これを行う簡単な方法はありますか?私はグループ化するのに何の問題もありませんが、どのようにでもグループを集約できますが、このボックスプロットで何が間違っているのかわかりません。

任意の助けをいただければ幸いです。

21
pbreach

私はそれを理解したと思う、おそらくこれは誰かに役立つでしょう:

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

基本的に、グループプロットの出力は、箱ひげ図が正しいグループ化を示すように転置する必要がありました。

enter image description here

14
pbreach

このコード:

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

BoxplotはDataFrameの関数であり、Seriesではないため、機能しません。

Pandas> 0.18.1)では、boxplot関数には引数columnsがあり、これはデータの取得元の列を定義します。

そう

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

目的の結果を返す必要があります。

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)

作成:

Boxplot iris dataset with pandas

plt.suptitle('') 

迷惑な自動字幕をオフにします。そしてもちろん、列引数は列のリストを受け入れます...

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

動作します。

41
schlump

これは、バージョン0.16で動作するはずです。

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