该文档说明如何将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
Run Code Online (Sandbox Code Playgroud)
但是,这仅适用于Series groupby对象.当dict类似地传递给一个由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(), ...)
Run Code Online (Sandbox Code Playgroud)
但正如预期的那样,我得到一个KeyError(因为如果agg从DataFrame中调用键,则键必须是一个列).
有没有内置的方法来做我想做的事情,或者可能添加这个功能的可能性,还是我只需要手动迭代组合?
谢谢
我有一个数据框,应将其分组,然后在每个组上应用几个函数。通常,我会这样做groupby().agg()(参见将多个函数应用于多个 groupby 列),但我感兴趣的函数不需要一列作为输入,而是需要多列。
我了解到,当我有一个具有多列作为输入的函数时,我需要apply(参见使用多列的 Pandas DataFrame 聚合函数)。
但是,当我有多个具有多个列作为输入的函数时,我需要什么?
import pandas as pd
df = pd.DataFrame({'x':[2, 3, -10, -10], 'y':[10, 13, 20, 30], 'id':['a', 'a', 'b', 'b']})
def mindist(data): #of course these functions are more complicated in reality
return min(data['y'] - data['x'])
def maxdist(data):
return max(data['y'] - data['x'])
Run Code Online (Sandbox Code Playgroud)
我期待类似的东西df.groupby('id').apply([mindist, maxdist])
min max
id
a 8 10
b 30 40
Run Code Online (Sandbox Code Playgroud)
(通过实现pd.DataFrame({'mindist':df.groupby('id').apply(mindist),'maxdist':df.groupby('id').apply(maxdist)}- 如果我有许多函数要应用于分组数据框,这显然不是很方便)。最初我以为这个OP有同样的问题,但他似乎对 很满意aggregate,这意味着他的函数只接受一列作为输入。