在pandas DataFrame中绘制分组数据的直方图

时间:2013-10-25 07:44:56

标签: python pandas histogram

我需要一些指导,以确定如何在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'对象”

最值得赞赏的任何帮助。

5 个答案:

答案 0 :(得分:132)

我正在滚动,只是在hist方法中使用 by 关键字找到了更简单的方法:

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

这是快速扫描分组数据的一个非常方便的小捷径!

对于将来的访问者,此次调用的产品如下图所示: enter image description here

答案 1 :(得分:7)

你的功能失败了,因为你最终得到的groupby数据帧有一个分层索引和两列(Letter和N),所以当你.hist()时,它试图制作两列的直方图,因此str错误。

这是pandas绘图函数的默认行为(每列一个图),因此如果您重塑数据框以使每个字母都是一列,您将得到您想要的结果。

df.reset_index().pivot('index','Letter','N').hist()

reset_index()只是将当前索引推送到名为index的列中。然后pivot将获取您的数据框,收集每个N的所有值Letter并将其设为列。生成的数据框为400行(使用NaN填充缺失值)和三列(A, B, C)。然后,hist()将为每列生成一个直方图,并根据需要格式化绘图。

答案 2 :(得分:3)

一种解决方案是直接在每个分组数据帧上使用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 :(得分:0)

使用最新版本的Pandas,您可以 df.N.hist(by=df.Letter)

就像上面的解决方案一样,每个子图的轴都不同。我还没有解决。

答案 4 :(得分:0)

我之所以写这个答案,是因为我正在寻找一种将不同组的直方图绘制在一起的方法。接下来的内容不是很聪明,但是对我来说效果很好。我使用Numpy来计算直方图和散景以进行绘图。我认为这是不言自明的,但是请随时进行澄清,我很乐意添加细节(并写得更好)。

figures = {
    'Transit': figure(title='Transit', x_axis_label='speed [km/h]', y_axis_label='frequency'),
    'Driving': figure(title='Driving', x_axis_label='speed [km/h]', y_axis_label='frequency')
}

cols = {'Vienna': 'red', 'Turin': 'blue', 'Rome': 'Orange'}
for gr in df_trips.groupby(['locality', 'means']):
    locality = gr[0][0]
    means = gr[0][1]
    fig = figures[means]
    h, b = np.histogram(pd.DataFrame(gr[1]).speed.values)
    fig.vbar(x=b[1:], top=h, width=(b[1]-b[0]), legend_label=locality, fill_color=cols[locality], alpha=0.5)

show(gridplot([
    [figures['Transit']],
    [figures['Driving']],
]))