Numpy 和 Pandas:从熊猫直方图返回直方图值?

Posted

技术标签:

【中文标题】Numpy 和 Pandas:从熊猫直方图返回直方图值?【英文标题】:Numpy & Pandas: Return histogram values from pandas histogram plot? 【发布时间】:2016-11-21 22:16:24 【问题描述】:

我知道我可以通过 pandas 绘制直方图:

df4 = pd.DataFrame('a': np.random.randn(1000) + 1)
df4['a'].hist()

但是如何从这样的图中检索直方图计数?

我知道我可以通过(来自Histogram values of a Pandas Series)

count,division = np.histogram(df4['a'])

但是用这个来获取df.hist()之后的count值感觉很多余。是否可以直接从 pandas 获取频率值?

【问题讨论】:

【参考方案1】:

快速回答是:

pd.cut(df4['a'], 10).value_counts().sort_index()

来自documentation:

bins: integer, default 10
Number of histogram bins to be used

那么看看pd.cut(df4['a'], 10).value_counts()

您会看到这些值与 np.histogram 中的值相同

【讨论】:

@cqcn1991 我知道你更喜欢 numpy。但这是否回答了您的问题? 有点。我认为如果我们能做类似count, division = df4['a'].hist() 这样的事情会很棒。这可以更方便,不需要额外的代码。 如何索引结果值?域和范围是哪个?【参考方案2】:

这是在 pandas 中计算直方图的另一种方法。它更复杂,但 IMO 更好,因为您避免了 pd.cut 返回的奇怪的字符串箱,这会破坏任何情节。您还将获得使用.pipe()的风格点数:

(df['a']
 .pipe(lambda s: pd.Series(np.histogram(s, range=(0, 100), bins=20)))
 .pipe(lambda s: pd.Series(s[0], index=s[1][:-1]))
)

然后您可以在最后通过管道传输更多内容,例如:

.pipe(lambda s: s/s.sum())

这会给你一个分布。

理想情况下,pd.hist 中应该有一个明智的 density 可以为您做到这一点。 Pandas 确实有一个 density=False 关键字,但它是荒谬的。我已经阅读了上千遍的解释,比如this one,但我从来不理解它,也不理解谁会真正使用它。当您在直方图上看到分数时,有 99.9% 的时间认为是“分布”,而不是 np.sum(pdf * np.diff(bins)) 实际计算的 np.sum(pdf * np.diff(bins))。让你想哭。

【讨论】:

以上是关于Numpy 和 Pandas:从熊猫直方图返回直方图值?的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib/pandas 中是不是有参数将直方图的 Y 轴作为百分比?

使用 matplotlib 和 pandas 从 csv 文件中绘制直方图

全网最全python实现数据挖掘,数据分析(matlablib,pandas,numpy,量化分析)(附源代码)

如何从 Pandas DataFrame 开始绘制堆叠时间直方图?

如何避免熊猫直方图子图中的绘图标题和轴标题之间的重叠? [复制]

绘制熊猫时间增量