DataError:没有使用平均聚合函数但不是sum的数值类型?

时间:2018-04-29 21:05:51

标签: python pandas pandas-groupby

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

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

无数据错误情况:

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:无需汇总的数字类型

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

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

然而,我试图理解为什么要与平均值进行汇总   功能提供了这样的错误吗?

2 个答案:

答案 0 :(得分:4)

这是由于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/exceptGroupByError,但只会重新加注而DataError继承自GroupByError。因此例外。

GroupBy.sum

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

摘要

所有这些都归结为两个聚合函数处理异常的不同方式; mean DataError重新加注sumpublic static void dfs(int x, int y, int value ) { if(matriz[x][y]==0) { SudokuSolved[x][y]=value; } boolean br= breakrule(x,y); if (br==false) { sol = solved(); } if(solved()==false&&br==false) { f++; if (f>=9) { f=0; c++; } for (int num=1;num<10;num++) { dfs(f,c,num); } } if(solved()==true&&br==false) { for (int i=0; i<9;i++) { System.out.println("-------------------"); System.out.print('|'); for (int j=0; j<9;j++) { System.out.print(SudokuSolved[i][j]); System.out.print('|'); } System.out.println(); } System.out.println("-------------------"); } } 没有加注{{1}}。 “为什么”对我来说仍然是一个悬而未决的问题。

另见

答案 1 :(得分:0)

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