如何从数据框中的一组数据绘制直方图块?例如,给定:
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”对象
一种解决方案是直接在每个分组数据帧上使用 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()
你的函数失败了,因为你最终得到的 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()
将为每列生成一个直方图,您可以根据需要设置图表的格式。
使用最新版本的 Pandas,您可以执行以下操作
df.N.hist(by=df.Letter)
就像上面的解决方案一样,每个子图的轴都会不同。我还没有解决这个问题。
我发现这更容易、更快。
data_df.groupby('Letter').count()['N'].hist(bins=100)
我写这个答案是因为我正在寻找一种方法来绘制不同组的直方图。接下来的内容不是很聪明,但对我来说效果很好。我使用 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']],
]))