熊猫直方图df.hist()group by

Han*_*gon 13 matplotlib histogram pandas

如何使用group by绘制带有pandas DataFrame.hist()的直方图?我有一个包含5列的数据框:"A","B","C","D"和"Group"

有两个组类:"是"和"否"

使用:

df.hist() 
Run Code Online (Sandbox Code Playgroud)

我得到了4列中每一列的直方图.

在此输入图像描述

现在我想得到相同的4个图,但有蓝色条(group ="yes")和红色条(group ="no").

我试过这个没有成功:

df.hist(by = "group")
Run Code Online (Sandbox Code Playgroud)

大熊猫出了问题

Imp*_*est 12

使用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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Bra*_*mon 10

这不是最灵活的解决方法,但具体适用于您的问题.

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您可以通过以下方式使其更通用:

  • 将a dfby参数添加到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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述