Pandas绘制数据帧索引的直方图。

13

我在pandas中有以下数据框(df):

       NetPrice  Units  Royalty
Price                       
3.65    9.13    171    57.60
3.69    9.23     13     4.54
3.70    9.25    129    43.95
3.80    9.49    122    42.76
3.90    9.74    105    38.30
3.94    9.86    158    57.35
3.98    9.95     37    13.45
4.17   10.42     69    27.32
4.82   12.04    176    77.93
4.84   24.22    132    59.02
5.16   12.91    128    60.81
5.22   13.05    129    62.00

我正在尝试在指数("Price")上创建一个直方图,y轴为"Units"。我从以下内容开始:

plt.hist(df.index)

这可以给我绘制价格的直方图。如何将单位添加到y轴上?现在它只是一个“刻度”。

谢谢!


直方图显示单个数据集中值的分布情况(例如,有多少个值落在3.6到3.8之间)。如果您想绘制两个变量之间的关系,那么您可能只需要一个条形图。请尝试使用“plt.bar(df.index, df.Units)”。 - snorthway
我的一些数据非常大,因此条形图不适用。我希望“有多少落在3.6到3.8之间”的数量成为单位数,这样我就可以始终看到每个区间销售了多少单位。 - DigitalMusicology
2个回答

26
因为你的数据已经部分聚合,所以不能直接使用hist()方法。就像@snorthway在评论中所说,你可以用条形图来实现这一点。只需先将数据放入存储桶中即可。我最喜欢使用pandas的cut()方法将数据放入存储桶中。
既然你没有提供易于使用的示例数据,让我们设置一些示例数据:
np.random.seed(1)
n = 1000
df = pd.DataFrame({'Price' : np.random.normal(5,2,size=n),
                   'Units' : np.random.randint(100, size=n)})

我们将价格放入10个等距桶中:

df['bucket'] = pd.cut(df.Price, 10)
print df.head()

      Price  Units           bucket
0  8.248691     98    (7.307, 8.71]
1  3.776487      8  (3.0999, 4.502]
2  3.943656     89  (3.0999, 4.502]
3  2.854063     27  (1.697, 3.0999]
4  6.730815     29   (5.905, 7.307]

现在我们有一个包含桶范围的字段。如果您想要给这些桶其他名称,您可以在优秀的Pandas文档中了解相关信息。现在我们可以使用Pandas的groupby()方法和sum()将单位相加:

newdf = df[['bucket','Units']].groupby('bucket').sum()
print newdf
                  Units
bucket                 
(-1.122, 0.295]     492
(0.295, 1.697]     1663
(1.697, 3.0999]    5003
(3.0999, 4.502]   11084
(4.502, 5.905]    15144
(5.905, 7.307]    11053
(7.307, 8.71]      4424
(8.71, 10.112]     1008
(10.112, 11.515]     77
(11.515, 12.917]    122

看起来很不错,现在让我们绘制它:

 newdf.plot(kind='bar')

输入图像描述


为什么直方图要用求和而不是计数? - rjurney

0
你可以将索引设置为一列,然后像这样绘制该列的直方图:
df["idx"] = df.index
df["idx"].hist()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接