如何将*多个*功能应用于熊猫 groupby 应用?

Posted

技术标签:

【中文标题】如何将*多个*功能应用于熊猫 groupby 应用?【英文标题】:How to apply *multiple* functions to pandas groupby apply? 【发布时间】:2019-12-19 05:13:24 【问题描述】:

我有一个数据框,它应该被分组,然后在每个组上应用几个函数。通常,我会使用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) 实现 - 如果我有十几个函数要应用于分组数据帧,这显然不是很方便)。最初我以为this OP 有同样的问题,但他似乎对aggregate 没问题,这意味着他的函数只需要一列作为输入。

【问题讨论】:

【参考方案1】:

对于这个具体问题,区别后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)))

【讨论】:

通用解决方案正是我所寻找的。 (正如我在代码的 cmets 中提到的那样,这些函数实际上更复杂 - 所以imo你可以删除答案的第一部分;))【参考方案2】:

IIUC 您想在同一组中使用多个功能。在这种情况下,您应该返回 pd.Series。在下面的玩具示例中,我想

    AB 列求和,然后计算平均值 对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)

【讨论】:

以上是关于如何将*多个*功能应用于熊猫 groupby 应用?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用带有应用功能的熊猫 groupby 来解决副作用? (第一组申请两次)

如何调试熊猫 groupby 应用功能

熊猫有效地将groupby函数应用于每一列[重复]

如何一次将函数应用于熊猫数据框中的多个列

熊猫 groupby 和 qcut

熊猫数据框:groupby 和 plot 有两个不同的列