我需要从数据框列创建一个直方图,其中包含值"低'中'中'高'。当我尝试执行通常的df.column.hist()时,我收到以下错误。
ex3.Severity.value_counts()
Out[85]:
Low 230
Medium 21
High 16
dtype: int64
ex3.Severity.hist()
TypeError Traceback (most recent call last)
<ipython-input-86-7c7023aec2e2> in <module>()
----> 1 ex3.Severity.hist()
C:\Users\C06025A\Anaconda\lib\site-packages\pandas\tools\plotting.py in hist_series(self, by, ax, grid, xlabelsize, xrot, ylabelsize, yrot, figsize, bins, **kwds)
2570 values = self.dropna().values
2571
->2572 ax.hist(values, bins=bins, **kwds)
2573 ax.grid(grid)
2574 axes = np.array([ax])
C:\Users\C06025A\Anaconda\lib\site-packages\matplotlib\axes\_axes.py in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)
5620 for xi in x:
5621 if len(xi) > 0:
->5622 xmin = min(xmin, xi.min())
5623 xmax = max(xmax, xi.max())
5624 bin_range = (xmin, xmax)
TypeError: unorderable types: str() < float()
答案 0 :(得分:20)
ex3.Severity.value_counts().plot(kind='bar')
是你真正想要的。
当你这样做时:
ex3.Severity.value_counts().hist()
它以错误的方式获取轴,即它试图将你的y轴(计数)分割成箱子,然后绘制每个箱子中的字符串标签数量。
答案 1 :(得分:4)
你假设因为你的数据是由字符串组成的,调用plot()
就会自动执行value_counts()
但事实并非如此,因此错误,你需要做的就是:
ex3.Severity.value_counts().hist()
答案 2 :(得分:2)
这是一个matplotlib问题,不能将字符串排在一起,但是你可以通过标记x-ticks来实现所需的结果:
# emulate your ex3.Severity.value_counts()
data = {'Low': 2, 'Medium': 4, 'High': 5}
df = pd.Series(data)
plt.bar(range(len(df)), df.values, align='center')
plt.xticks(range(len(df)), df.index.values, size='small')
plt.show()
答案 3 :(得分:2)
只是一个更新的答案(这会涉及很多问题。)Pandas有一个很好的模块,可以用多种方式来对数据框进行样式设置,例如上面提到的情况。...
ex3.Severity.value_counts().to_frame().style.bar()
...将打印带有内置条形的数据框(使用Excel术语作为迷你图)。非常适合在jupyter笔记本上进行快速分析。