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 开始绘制堆叠时间直方图?