web-dev-qa-db-ja.com

pandas DataFrameでグループ化されたデータからヒストグラムをプロットする

pandasデータフレーム内のグループ化されたデータからヒストグラムのブロックをプロットする方法を理解するためのガイダンスが必要です。ここに私の質問を説明する例を示します。

from pandas import DataFrame
import numpy as np
x = ['A']*300 + ['B']*400 + ['C']*300
y = np.random.randn(1000)
df = DataFrame({'Letter':x, 'N':y})
grouped = df.groupby('Letter')

私の無知で、私はこのコードコマンドを試しました:

df.groupby('Letter').hist()

「TypeError: 'str'および 'float'オブジェクトを連結できません」というエラーメッセージで失敗しました

どんな助けも大歓迎です。

43
dreme

私はロールバック中です。histメソッドでbyキーワードを使用して、さらに簡単な方法を見つけました。

df['N'].hist(by=df['Letter'])

これは、グループ化されたデータをすばやくスキャンするための非常に便利な小さなショートカットです!

将来の訪問者にとって、このコールの製品は次のチャートです。 enter image description here

137
dreme

最終的にはgroupbyデータフレームには階層インデックスと2つの列(LetterおよびN)があるため、関数は失敗します。したがって、.hist()を実行すると、両方の列のヒストグラムを作成しようとするため、strエラーになります。

これは、pandasプロット関数(列ごとに1つのプロット)のデフォルトの動作です。したがって、各文字が列になるようにデータフレームを再形成すると、希望どおりになります。

_df.reset_index().pivot('index','Letter','N').hist()
_

reset_index()は、現在のインデックスをindexという列に押し込むだけです。次に、pivotがデータフレームを取得し、各Nのすべての値Letterを収集し、それらを列にします。結果のデータフレームは400行(欠損値をNaNで埋める)と3列(_A, B, C_)になります。 hist()は列ごとに1つのヒストグラムを生成し、必要に応じてプロットのフォーマットを取得します。

7
cwharland

1つの解決策は、グループ化された各データフレームでmatplotlibヒストグラムを直接使用することです。ループで取得したグループをループできます。各グループはデータフレームです。そして、それぞれにヒストグラムを作成できます。

from pandas import DataFrame
import numpy as np
x = ['A']*300 + ['B']*400 + ['C']*300
y = np.random.randn(1000)
df = DataFrame({'Letter':x, 'N':y})
grouped = df.groupby('Letter')

for group in grouped:
  figure()
  matplotlib.pyplot.hist(group[1].N)
  show()
3
Paul

Pandasの最新バージョンでは、df.N.hist(by=df.Letter)を実行できます

上記のソリューションと同様に、軸はサブプロットごとに異なります。まだ解決していません。

0
dirkjot