【问题标题】:DataError: No numeric types using mean aggregate function but not sum?DataError:没有使用平均聚合函数但不求和的数字类型?
【发布时间】:2018-04-29 21:05:51
【问题描述】:

我想知道是否有人可以使用 agg() 帮助解释以下行为

import numpy as np
import pandas as pd
import string

初始化数据框

df = pd.DataFrame(data=[list(string.ascii_lowercase)[0:5]*2,list(range(1,11)),list(range(11,21))]).T
df.columns = columns=['g','c1','c2']

df.sort_values(['g']).head(5)

g   c1  c2
0   a   1   11
5   a   6   16
1   b   2   12
6   b   7   17
2   c   3   13

作为一个例子,我在按 g 分组时对 c1 和 c2 进行求和和平均

无数据错误场景:

f = { 'c1' : lambda g: df.loc[g.index].c2.sum() + g.sum(), 'c2' : lambda g: (df.loc[g.index].c1.sum() + g.sum())/(g.count()+df.loc[g.index].c1.count())} 
df = df.groupby('g',as_index=False).agg(f)

数据类型错误:

rnm_cols = dict(sum='Sum', mean='Mean') #, std='Std')
df = df.set_index(['g']).stack().groupby('g').agg(rnm_cols.keys()).rename(columns=rnm_cols)

我得到了 -> DataError: No numeric types to aggregate

我知道如果我使用下面的方法初始化我的数据框,我可以避免这个问题:

df[['c1','c2']] = df[['c1','c2']].apply(lambda x: pd.to_numeric(x, errors='coerce'))

但是我试图理解为什么要与平均值聚合 函数提供了这样的错误?

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    这是由于GroupBy 对象处理不同聚合方法的方式。事实上,summean 的处理方式不同(详情见下文)。

    但最重要的是 mean 仅适用于您的数据框中不存在的数字类型:

    >>> df.dtypes
    g     object
    c1    object
    c2    object
    dtype: object
    

    通过应用pd.to_numeric,您可以将它们转换为数字类型,agg 可以工作。

    但让我们仔细看看:

    GroupBy.mean

    这个函数调用调度到self._cython_agg_general,它检查数字类型,如果它没有找到任何类型(你的例子就是这种情况),它会引发一个DataError。尽管对self._cython_agg_general 的调用包含在try/except 中,以防GroupByError 它只是重新引发并且DataError 继承自GroupByError。因此例外。

    GroupBy.sum

    此函数以不同的方式定义,即here(通过this function)。 wrapper function 类似地发送到 self._cython_agg_general,包裹在 try/except 中,但它没有为 GroupByErrors 添加特定子句(不知道为什么;也许这对开发人员来说是个好问题,所以他们可以统一GroupBy 对象的行为)。因为self._cython_agg_general 再次引发DataError,它将进入except Exception 子句,它会回退到self.aggregate。从这里你可以通过十几个额外的函数调用来追踪它,但最后它只会添加系列的单个项目(存储为objects,但在 Python 中添加没有问题,因为它们是 int事实上)。

    总结

    所以这一切都归结为两个聚合函数处理异常的不同方式; meanDataError 上重新加注,但sum 没有。 “为什么”对我来说仍然是一个悬而未决的问题。

    另见

    【讨论】:

    • 谢谢!这很有意义 --- 下次会更深地陷入错误
    【解决方案2】:

    我最近也遇到了这个错误。发现在安装某些软件包时,我的 pandas 被降级了,这是导致此错误的原因。更新了 pandas,它开始正常工作了。

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2020-09-20
      • 1970-01-01
      • 2021-08-07
      相关资源
      最近更新 更多