76

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

非常感谢任何帮助。

4

6 回答 6

207

我很高兴,刚刚找到了一种更简单的方法来使用 hist 方法中的by关键字:

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

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

对于未来的访客,本次通话的产品如下图: 在此处输入图像描述

于 2013-10-26T06:59:47.310 回答
9

你的函数失败了,因为你最终得到的 groupby 数据框有一个分层索引和两列(字母和 N),所以当你这样做时,.hist()它试图制作两列的直方图,因此出现 str 错误。

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

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

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

于 2013-10-25T14:33:29.247 回答
8

一种解决方案是直接在每个分组数据帧上使用 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()
于 2013-10-25T12:17:21.073 回答
6

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

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

于 2019-06-18T06:52:41.007 回答
1

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

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']],
]))
于 2020-10-24T17:26:41.600 回答
1

我发现这更容易和更快。

data_df.groupby('Letter').count()['N'].hist(bins=100)

于 2021-08-25T22:18:01.080 回答