【问题标题】:Pandas Dataframe Groupby Apply Lambda Function With Multiple Column ReturnsPandas Dataframe Groupby 应用具有多列返回的 Lambda 函数
【发布时间】:2017-03-31 02:36:59
【问题描述】:

我在 SO 上找不到任何内容。我想要做的是在我现有的数据帧上生成 4 个新列,方法是应用一个具有 4 个特定列作为输入的单独函数并返回 4 个输出列,而不是 4 个初始列。但是,该函数要求我在使用前按条件对数据帧进行切片。我一直在使用 for 循环和追加,但它非常慢。我希望有一种方法可以进行 MapReduce 式操作,它可以使用我的 DataFrame,执行 groupby 并应用我单独编写的函数。

函数有多个输出,想象一下这样的函数:

    def func(a,b,c,d):
        return f(a),g(b),h(c),i(d)

其中 f,g,h,i 是对输入执行的不同函数。我正在尝试做类似的事情:

    import pandas as pd

    df = pd.DataFrame({'a': range(10),
                       'b': range(10),
                       'c': range(10),
                       'd':range(10},
                       'e': [0,0,0,0,0,1,1,1,1,1])

    df.groupby('e').apply(lambda df['x1'],df['x2'],df['x3'],df['x4'] =
                          func(df['a'],df['b'],df['c'],df['d']))

想知道这是否可能。如果库中还有其他功能/更有效的方法来解决这个问题,请提供建议。谢谢。

编辑:这是一个示例输出

   a  b  c  d  e  f  g  h  i 
   --------------------------
   0  0  0  0  0  f1 g1 h1 i1
   1  1  1  1  1  f2 g2 h2 i2
    ... and so on 

我喜欢这种操作方向的原因是函数的操作在执行函数之前依赖于数据中的结构(因此是 groupby)。以前,我在将数据帧切片的同时获取唯一值并对其进行迭代,然后将其附加到新的数据帧。以二次方时间运行。

【问题讨论】:

    标签: python pandas dataframe lambda apply


    【解决方案1】:

    你可以这样做:

    def f(data):
        data['a2']=data['a']*2 #or whatever function/calculation you want
        data['b2']=data['b']*3 #etc etc
        #e.g. data['g']=g(data['b'])
        return data
    
    df.groupby('e').apply(f)
    

    【讨论】:

    • 这行得通!我的最终解决方案将函数嵌套在新函数中,但工作方式相同。谢谢你
    • 顺便说一句,另一个不错的选择可能是使用 groupby.transform 函数。在这种情况下,您将一次在一列上调用它,然后将这些列附加到您的数据框中。它可能会更有效率。
    猜你喜欢
    • 2020-11-20
    • 2018-06-07
    • 1970-01-01
    • 2019-10-22
    • 2019-04-04
    • 2021-10-04
    • 2018-02-23
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多