相关疑难解决方法(0)

将多个函数应用于多个groupby列

文档说明如何将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中调用键,则键必须是一个列).

有没有内置的方法来做我想做的事情,或者可能添加这个功能的可能性,还是我只需要手动迭代组合?

谢谢

python group-by aggregate-functions pandas

183
推荐指数
6
解决办法
14万
查看次数

如何将*多个*函数应用于pandas groupby apply?

我有一个数据框,应将其分组,然后在每个组上应用几个函数。通常,我会这样做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,这意味着他的函数只接受一列作为输入。

aggregate function apply pandas pandas-groupby

5
推荐指数
2
解决办法
9766
查看次数