【发布时间】:2013-01-09 21:23:02
【问题描述】:
docs 展示了如何使用以输出列名作为键的 dict 一次对 groupby 对象应用多个函数:
In [563]: grouped['D'].agg({'result1' : np.sum,
.....: 'result2' : np.mean})
.....:
Out[563]:
result2 result1
A
bar -0.579846 -1.739537
foo -0.280588 -1.402938
但是,这仅适用于 Series groupby 对象。当一个 dict 类似地传递给一个 groupby DataFrame 时,它期望键是该函数将应用于的列名。
我想要做的是将多个函数应用于多个列(但某些列将被多次操作)。此外,某些函数将依赖于 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].sum(), ...)
但正如预期的那样,我得到了一个 KeyError(因为如果从 DataFrame 调用 agg,则键必须是一列)。
是否有任何内置方法可以做我想做的事情,或者有可能添加此功能,还是我只需要手动遍历 groupby?
【问题讨论】:
-
如果您在 2017 年+ 来回答这个问题,请参阅 answer below 以了解将多个列聚合在一起的惯用方式。当前选择的答案有多个弃用,即您不能再使用字典字典来重命名 groupby 结果中的列。
标签: python group-by aggregate-functions pandas