DataError:没有使用平均聚合函数但不使用总和的数字类型?

2024-04-15

我想知道是否有人可以帮助解释使用 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)

我得到了->数据错误:没有要聚合的数字类型

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

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

然而我试图理解为什么要与平均值相加 函数提供了这样的错误?


这是由于方法GroupBy对象处理不同的聚合方法。实际上sum and mean处理方式不同(有关更多详细信息,请参阅下文)。

但底线是mean仅适用于数据框中不存在的数字类型:

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

通过应用pd.to_numeric您将它们转换为数字类型并且agg works.

但让我们仔细看看:

GroupBy.mean https://github.com/pandas-dev/pandas/blob/632204359249093d1305e71183be932ceceeee78/pandas/core/groupby/groupby.py#L1263

该函数调用分派到self._cython_agg_general https://github.com/pandas-dev/pandas/blob/632204359249093d1305e71183be932ceceeee78/pandas/core/groupby/groupby.py#L1006它检查数字类型,如果没有找到任何类型(您的示例就是这种情况),它会引发DataError https://github.com/pandas-dev/pandas/blob/632204359249093d1305e71183be932ceceeee78/pandas/core/base.py#L166。虽然打电话给self._cython_agg_general被包裹在try/except如果有GroupByError它只是重新加注并且DataError继承自GroupByError。因此例外。

GroupBy.sum

这个函数的定义方式不同,即here https://github.com/pandas-dev/pandas/blob/632204359249093d1305e71183be932ceceeee78/pandas/core/groupby/groupby.py#L1431 (via 这个功能 https://github.com/pandas-dev/pandas/blob/632204359249093d1305e71183be932ceceeee78/pandas/core/groupby/groupby.py#L1370). The 包装函数 https://github.com/pandas-dev/pandas/blob/632204359249093d1305e71183be932ceceeee78/pandas/core/groupby/groupby.py#L1379同样分派到self._cython_agg_general, 包装成try/except,但它没有添加特定的子句GroupByErrors (不知道为什么;也许这对开发人员来说是一个很好的问题,这样他们就可以统一GroupBy对象)。因为self._cython_agg_general再次提出DataError它将进入except Exception https://github.com/pandas-dev/pandas/blob/632204359249093d1305e71183be932ceceeee78/pandas/core/groupby/groupby.py#L1390它回退到的子句self.aggregate https://github.com/pandas-dev/pandas/blob/632204359249093d1305e71183be932ceceeee78/pandas/core/groupby/groupby.py#L3408。从这里您可以通过十几个附加函数调用来追踪它,但最终它只会添加该系列的单个项目(这些项目存储为object但在 Python 中添加是没有问题的,因为它们是int事实上)。

Summary

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

See also

  • groupby 聚合与非数字类型不一致 https://github.com/pandas-dev/pandas/issues/13416
  • SeriesGroupby.cumsum 在对象 dtype 上引发 https://github.com/pandas-dev/pandas/issues/13992
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DataError:没有使用平均聚合函数但不使用总和的数字类型? 的相关文章

随机推荐