【问题标题】:Why does mean() have different behavior on empty DataFrames?为什么 mean() 在空 DataFrame 上有不同的行为?
【发布时间】:2014-10-10 20:29:49
【问题描述】:

如果我在 pandas 中有一个像这样的空 DataFrame:

df = pandas.DataFrame(columns=['a','b','c'])
>>> df
Empty DataFrame
Columns: [a, b, c]
Index: []

我在组上进行聚合,输出将通常是一个空的 DataFrame:

>>> df.groupby('a', as_index=False).sum()
Empty DataFrame
Columns: [a, b, c]
Index: []

我说通常是因为并非总是如此。它对min()max()sum()count()quantile() 有效,但不适用于mean(),这会引发异常:

>>> df.groupby('a', as_index=False).mean()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/pandas/core/groupby.py", line 666, in mean
    return self._cython_agg_general('mean')
  File "/usr/local/lib/python2.7/site-packages/pandas/core/groupby.py", line 2358, in _cython_agg_general
    new_items, new_blocks = self._cython_agg_blocks(how, numeric_only=numeric_only)
  File "/usr/local/lib/python2.7/site-packages/pandas/core/groupby.py", line 2408, in _cython_agg_blocks
    raise DataError('No numeric types to aggregate')
pandas.core.groupby.DataError: No numeric types to aggregate

为什么这个聚合函数的行为不同?

我在 python 2.7 上使用 pandas 0.14.1。

【问题讨论】:

  • 如果你查看源代码,你会看到不同的方法是如何创建和调用的

标签: python pandas dataframe


【解决方案1】:

这个异常是针对真正的groupby函数引发的:http://pandas.pydata.org/pandas-docs/stable/api.html#id35,当你调用sum时,这是调用Series或df版本,没有这个限制。

所以实际上meanmediansemstdvarohlc 都会引发异常。

另请注意,如果您有非数字数据,则会引发异常。

比较使用mean 调用apply 时发生的情况:

In [18]:

df.groupby('a', as_index=False).apply(mean)
Out[18]:
Empty DataFrame
Columns: []
Index: []

在应用 Series 或 Df 版本时不会引发异常。

【讨论】:

    【解决方案2】:

    我不太确定,但我假设这是因为mean() 会除以数据帧中的元素数,在本例中为 0。这会导致除以零错误。我会抓住抛出的错误

    【讨论】:

    • 我认为你是对的,std()var() 也引发了异常。
    猜你喜欢
    • 2015-03-08
    • 2017-02-07
    • 2012-07-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多