如何在pandas groupby apply中应用多个函数?

5
我有一个数据框,需要对其进行分组,然后在每个组上应用多个函数。通常,我会使用 groupby().agg()(参见Apply multiple functions to multiple groupby columns),但我感兴趣的函数不需要一个列作为输入,而是需要多个列。
我了解到,当我有一个具有多个列作为输入的函数时,我需要使用apply(参见Pandas DataFrame aggregate function using multiple columns)。但是,如果我有多个具有多个列作为输入的函数,我需要什么呢?
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'])

我会期望得到类似于 df.groupby('id').apply([mindist, maxdist]) 的语句。
    min   max
id      
 a    8    10
 b   30    40

使用 pd.DataFrame({'mindist':df.groupby('id').apply(mindist),'maxdist':df.groupby('id').apply(maxdist)} 实现(如果我有一打要应用于分组数据框的函数,这显然不是很方便)。 最初我认为这位OP有同样的问题,但他似乎对aggregate满意,这意味着他的函数只接受一个列作为输入。
2个回答

10
针对这个具体的问题,先进行差分,然后再使用groupby怎么样?
(df['x']-df['y']).groupby(df['id']).agg(['min','max'])

更一般地说,您可以尝试类似以下的操作:

df.groupby('id').apply(lambda x:pd.Series({'min':mindist(x),'max':maxdist(x)}))

通用解决方案正是我所寻找的。(正如我在代码注释中提到的,实际上这些函数更加复杂 - 因此我认为你可以删除你回答中的第一部分 ;)) - Qaswed

6

若您希望在同一组中使用多个函数,应当返回一个pd.Series。在下面的示例中,我想要进行以下操作:

  1. 求列AB的总和,然后计算平均值
  2. 求列CD的总和,然后计算标准差
import pandas as pd
df = pd.util.testing.makeDataFrame().head(10)
df["key"] = ["key1"] * 5 + ["key2"] * 5

def fun(x):
    m = (x["A"]+x["B"]).mean()
    s = (x["C"]+x["D"]).std()
    return pd.Series({"meanAB":m, "stdCD":s})

df.groupby("key").apply(fun)

更新 在您的情况下变成了

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'])

def fun(data):
    return pd.Series({"maxdist":maxdist(data),
                      "mindist":mindist(data)})

df.groupby('id').apply(fun)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接