我想知道是否有人可以使用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'))
然而,我试图理解为什么要与平均值进行汇总 功能提供了这样的错误吗?
答案 0 :(得分:4)
这是由于GroupBy
个对象处理不同聚合方法的方式。实际上,sum
和mean
的处理方式不同(有关详细信息,请参见下文)。
但最重要的是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)。 self._cython_agg_general
类似地发送到try/except
,包含在GroupByError
中,但它没有为GroupBy
添加特定条款(不知道为什么;也许这是个好问题)对于开发人员来说,他们可以统一self._cython_agg_general
个对象的行为。由于DataError
再次引发object
,它将输入wrapper function条款,并将其返回except Exception
。从这里你可以通过十几个额外的函数调用来追踪它,但最后它只会添加系列中的单个项目(存储为int
,但添加Python是没有问题的,因为它们是{事实上{1}}。
所有这些都归结为两个聚合函数处理异常的不同方式; mean
DataError
重新加注sum
但public 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)
我最近也遇到了这个错误。发现在安装某些软件包时,我的熊猫被降级了,这是导致此错误的原因。更新了熊猫,它开始正常工作。