【问题标题】:Numpy & Pandas: Return histogram values from pandas histogram plot?Numpy 和 Pandas:从熊猫直方图返回直方图值?
【发布时间】: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 获取频率值?

【问题讨论】:

    标签: python numpy pandas matplotlib


    【解决方案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))。让你想哭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 2017-09-24
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多