过滤数据框的 Pandas 直方图

Posted

技术标签:

【中文标题】过滤数据框的 Pandas 直方图【英文标题】:Pandas Histogram of Filtered Dataframe 【发布时间】:2014-04-24 21:10:22 【问题描述】:

在过去的一个小时里,这一直让我发疯。使用时可以画直方图:

hist(df.GVW, bins=50, range=(0,200))

当我需要为其中一列中的给定条件过滤数据框时,我使用以下内容,例如:

df[df.TYPE=='SU4']

到目前为止,一切正常。当我尝试获取此过滤数据的直方图时,我得到一个关键错误:KeyError: 0L。我使用以下过滤数据的直方图:

hist(df[df.TYPE=='SU4'].GVW, bins=50, range=(0,200))

某处是否存在语法错误?感谢您的帮助!

【问题讨论】:

考虑使用系列方法 hist 而不是...您正在使用的任何一个 (?)。我怀疑使用值会起作用,即df[df.TYPE=='SU4'].GVW.values @AndyHayden 啊,同时发了。你应该把答案作为答案:-) @AndyHayden 当我使用 values 属性时它确实有效。直觉上,我希望它可以在没有它的情况下工作。好吧,糟糕的直觉:) @joris 哈哈!这更像是一个猜测而不是一个答案。 marillion:IMO 很奇怪/unpythonic, hist 关心这个并且不只是迭代它。 【参考方案1】:

也许可以尝试使用.values 属性(这会将数据作为numpy 数组返回),所以:

hist(df[df.TYPE=='SU4'].GVW.values, bins=50, range=(0,200))

我认为这不起作用的原因是 matplotlib hist 方法试图访问输入的第一个 0-index 元素。但是因为 Series 使用它的整数索引作为标签而不是位置,这给切片 Series 带来了关键错误(因为第一个元素将不再有索引 0


确实,正如@AndyHayden 所说,您也可以使用 pandas hist 方法:

df[df.TYPE=='SU4'].GVW.hist(bins=50)

【讨论】:

终于在我的屏幕上看到了直方图 :) 是的,这行得通。不知道为什么没有.values 属性它不起作用。它适用于未屏蔽的df。奇怪... 添加了一个可能的原因,但不完全确定。因此,为了避免此类问题,有时最好使用 pandas 绘图方法,或使用 .values 属性。 这是一个关于原因的线程:github.com/matplotlib/matplotlib/issues/2775;称其为 matplotlib 与 pandas 的 API 不兼容 @Jeff 似乎这很容易解决 (try: x = x.values) ? 它必须在 matplotlib 端完成,我有很多相当通用的建议,其中一个是使用 values 属性,最好是简单地检查一个 ndim 属性,这将适用于所有实际上不是子类的 ndarray-like【参考方案2】:

我在绘制使用查询导出的数据框时遇到了类似的问题。我发现如果在派生框架后我在派生框架上使用 reset_index() 函数,它就解决了问题。

【讨论】:

这对我也有帮助

以上是关于过滤数据框的 Pandas 直方图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 中使用预聚合数据绘制直方图?

想要将 Pandas 数据框绘制为具有 log10 比例 x 轴的多个直方图

Python中Pandas/Matplotlib中直方图和密度的叠加

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

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

使用 matplotlib 在一个子图中绘制来自 pandas DataFrame 的两个直方图