这些文档展示了如何使用以输出列名为键的dict一次在groupby对象上应用多个函数:
[563]on
:分组为['D'].agg({'result1':np.sum,
..…:“result2”:np.mean})
.....:
Output[563]:
结果2结果1
A.
巴-0.579846-1.739537
foo-0.280588-1.402938
但是,这仅适用于Series groupby对象。当dict类似地传递给groupby数据帧时,它希望键是将应用该函数的列名
我想做的是对几个列应用多个函数(但某些列将被多次操作)。另外,一些函数将依赖于groupby对象中的其他列(如sumif函数)。我当前的解决方案是逐列执行,并执行类似于上面代码的操作,对依赖于其他行的函数使用lambdas。但这需要很长时间(我认为遍历groupby对象需要很长时间)。我必须对其进行更改,以便在一次运行中遍历整个groupby对象,但我想知道pandas中是否有一种内置的方法可以干净地完成这项工作
例如,我试过类似的方法
grouped.agg({'C_sum':lambda x:x['C'].sum(),
'C_std':lambda x:x['C'].std(),
“D_sum”:lambda x:x['D'].sum(),
“D_sumifC3”:lambda x:x['D'][x['C']==3]。求和(),…)
但正如预期的那样,我得到了一个keyrerror(因为如果从数据帧调用agg,则键必须是一列)
是否有任何内置的方式来完成我想做的事情,或者可能会添加此功能,或者我只需要手动迭代groupby
谢谢
目前被接受的答案的后半部分已经过时,并且有两个反对意见。首先也是最重要的一点,您不能再将字典字典传递给agggroupby方法。第二,永远不要使用.ix
如果希望同时处理两个单独的列,我建议使用apply方法,该方法隐式地将数据帧传递给应用的函数。让我们使用与上面的数据帧类似的数据帧
df=pd.DataFrame(np.random.rand(4,4),columns=list(’abcd’))
df[‘group’]=[0,0,1,1]
df
a、b、c、d群
0 0.418500 0.030955 0.874869 0.145641 0
1 0.446069 0.901153 0.095052 0.487040 0
2 0.843026 0.936169 0.926090 0.041722 1
3 0.635846 0.439175 0.828787 0.714123 1
从列名映射到聚合函数的字典仍然是执行聚合的完美方式
df.groupby('group').agg({'a':['sum','max'],
‘b’:‘平均’,
‘c’:‘sum’,
“d”:lambda x:x.max()-x.min())
a、b、c、d
总和最大平均总和<;lambda>;
组
0 0.864569 0.446069 0.466054 0.969921 0.341399
1 1.478872 0.843026 0.687672 1.754877 0.672401
如果您不喜欢这个难看的lambda列名,可以使用普通函数并为特殊的\uuuuu name\uuuu属性提供自定义名称,如下所示:
def max_min(x):
返回x.max()-x.min()
max\u min.\uu\u name\uu='max减min'
df.groupby('group').agg({'a':['sum','max'],
‘b’:‘平均’,
‘c’:‘sum’,
“d”:最大值(最小值)
a、b、c、d
求和最大值平均求和最大值减去最小值
组
0 0.864569 0.446069 0.466054 0.969921 0.341399
1 1.478872 0.843026 0.687672 1.754877 0.672401
使用apply并返回序列
现在,如果有多个列需要一起交互,那么就不能使用agg,它会隐式地将一个序列传递给聚合函数。使用apply时,将整个组作为数据帧传递到函数中
我建议创建一个自定义函数,返回一系列的所有聚合。将系列索引用作新列的标签:
def(x):
d={}
d['a_sum']=x['a'].sum()
d['a_max']=x['a'].max()
d['b_平均值']=x['b'].平均值()
d['c_d_prodsum']=(x['c']*x['d'])。sum()
返回pd.系列(d,索引=['a_sum','a_max','b_mean','c_d_prodsum'])
df.groupby('group')。应用(f)
a_和a_最大b_平均c_d_和
组
0 0.864569 0.446069 0.466054 0.173711
1 1.478872 0.843026 0.687672 0.630494
如果您喜欢多索引,您仍然可以返回一个包含以下内容的系列:
def_mi(x):
d=[]
d、 追加(x['a'].sum())
d、 追加(x['a'].max())
d、 追加(x['b'].mean())
d、 追加((x['c']*x['d']).sum())
返回pd.系列(d,索引=['a','a','b','c_d'],
['sum','max','mean','prodsum']]
df.groupby('group')。应用(f_mi)
a b cêd
最大平均生产总值
组
0 0.864569 0.446069 0.466054 0.173711
1 1.478872 0.843026 0.687672 0.630494