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

问题描述 投票:0回答:6

如何从数据框中的一组数据绘制直方图块?例如,给定:

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})

我尝试过:

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

...失败并显示错误消息:

类型错误:无法连接“str”和“float”对象

python pandas histogram
6个回答
251
投票

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

df.hist('N', by='Letter')

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

对于未来的访客,本次通话的产品如下图:


14
投票

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

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()
将为每列生成一个直方图,您可以根据需要设置图表的格式。


8
投票

使用最新版本的 Pandas,您可以执行以下操作

df.N.hist(by=df.Letter)

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


2
投票

我发现这更容易、更快。

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


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']],
]))
© www.soinside.com 2019 - 2024. All rights reserved.