Pandas Dataframe Groupby应用具有多列返回的Lambda函数

时间:2017-03-31 02:36:59

标签: python pandas dataframe lambda apply

我在这方面找不到任何东西。我尝试做的是在我现有的数据帧上生成4个新列,方法是应用一个包含4个特定列作为输入的单独函数,并返回4个不是4个初始列的输出列。但是,该功能要求我在使用前按条件对数据帧进行切片。我一直在使用for循环和附加,但它非常慢。我希望有一种方法可以进行MapReduce-esque操作,它需要我的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)。以前,我在获取数据帧之前获取了唯一值并迭代它们,然后将其附加到新的数据帧。以二次方式运行。

1 个答案:

答案 0 :(得分: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)