【问题标题】:How to apply *multiple* functions to pandas groupby apply?如何将*多个*功能应用于熊猫 groupby 应用?
【发布时间】: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 没问题,这意味着他的函数只需要一列作为输入。

【问题讨论】:

    标签: pandas function aggregate apply pandas-groupby


    【解决方案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。在下面的玩具示例中,我想

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-02-28
      • 2018-08-12
      • 1970-01-01
      • 2021-11-20
      • 2016-11-15
      • 1970-01-01
      • 2018-12-07
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多