web-dev-qa-db-ja.com

Pandasヒストグラムdf.hist()グループ化

pandas DataFrame.hist()でgroup byを使用してヒストグラムをプロットする方法は?「A」、「B」、「C」、「D」の5列のデータフレームがあります。 "グループ"

「はい」と「いいえ」の2つのグループクラスがあります。

使用:

df.hist() 

4つの列それぞれの履歴を取得します。

enter image description here

次に、同じ4つのグラフを取得しますが、青いバー(group = "yes")と赤いバー(group = "no")を使用します。

私は成功せずにこれを試しました:

df.hist(by = "group")

pandas hist went wrong

14
Hangon

これは最も柔軟な回避策ではありませんが、具体的にはあなたの質問に役立ちます。

_def sephist(col):
    yes = df[df['group'] == 'yes'][col]
    no = df[df['group'] == 'no'][col]
    return yes, no

for num, alpha in enumerate('abcd'):
    plt.subplot(2, 2, num)
    plt.hist(sephist(alpha)[0], bins=25, alpha=0.5, label='yes', color='b')
    plt.hist(sephist(alpha)[1], bins=25, alpha=0.5, label='no', color='r')
    plt.legend(loc='upper right')
    plt.title(alpha)
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
_

enter image description here

あなたはこれをより一般的にすることができます:

  • dfおよびbyパラメータをsephistに追加:def sephist(df, by, col)
  • サブプロットループをより柔軟にする:for num, alpha in enumerate(df.columns)

_matplotlib.pyplot.hist_ の最初の引数は

同じ長さである必要がない単一の配列または一連の配列のいずれか

...代替は次のようになります:

_for num, alpha in enumerate('abcd'):
    plt.subplot(2, 2, num)
    plt.hist((sephist(alpha)[0], sephist(alpha)[1]), bins=25, alpha=0.5, label=['yes', 'no'], color=['r', 'b'])
    plt.legend(loc='upper right')
    plt.title(alpha)
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
_

enter image description here

10
Brad Solomon

Seabornの使用

Seabornを使用できる場合は、seaborn.FacetGridを使用して、複数のサブプロットと各サブプロット内の複数の変数を含むプロットを簡単に作成できます。

import numpy as np; np.random.seed(1)
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.randn(300,4), columns=list("ABCD"))
df["group"] = np.random.choice(["yes", "no"], p=[0.32,0.68],size=300)

df2 = pd.melt(df, id_vars='group', value_vars=list("ABCD"), value_name='value')

bins=np.linspace(df2.value.min(), df2.value.max(), 10)
g = sns.FacetGrid(df2, col="variable", hue="group", palette="Set1", col_wrap=2)
g.map(plt.hist, 'value', bins=bins, ec="k")

g.axes[-1].legend()
plt.show()

enter image description here