繁体   English   中英

从 Pandas DataFrame 中的分组数据绘制直方图

[英]Plotting histograms from grouped data in a pandas DataFrame

我需要一些指导来解决如何从 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: cannot concatenate 'str' and 'float' objects”

任何帮助最受赞赏。

我正在努力,刚刚找到了一种更简单的方法来使用 hist 方法中的by关键字:

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

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

对于未来的访问者,本次通话的产品如下图:在此处输入图片说明

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

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

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

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

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

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

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

我写这个答案是因为我正在寻找一种将不同组的直方图绘制在一起的方法。 接下来的内容不是很聪明,但对我来说效果很好。 我使用 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']],
]))

我发现这更容易和更快。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM