python:将agg与多个自定义功能结合使用

时间:2020-02-12 20:43:10

标签: python pandas pandas-groupby

我有一个这样的数据框。

mydf = pd.DataFrame({'a':[1,1,3,3],'b':[np.nan,2,3,6],'c':[1,3,3,9]})

   a    b  c
0  1  NaN  1
1  1  2.0  3
2  3  3.0  3
3  3  6.0  9

我想要一个这样的结果数据框。

myResults = pd.concat([mydf.groupby('a').apply(lambda x: (x.b/x.c).max()), mydf.groupby('a').apply(lambda x: (x.b/x.c).min())], axis =1)
myResults.columns = ['max','min']

        max       min
a
1  0.666667  0.666667
3  1.000000  0.666667

基本上,我希望每个组(按column b分组)的column ccolumn a的最大和最小比率

是否可以通过agg实现? 我尝试了mydf.groupby('a').agg([lambda x: (x.b/x.c).max(), lambda x: (x.b/x.c).min()])。它将不起作用,并且似乎无法识别列名bc

我能想到的另一种方法是将比率列首先添加到mydf中。即mydf['ratio'] = mydf.b/mydf.c,然后在agg之类的更新后的mydf上使用mydf.groupby('a')['ratio'],agg[max,min]

是否有更好的方法通过agg或其他功能来实现?总而言之,我想将自定义函数应用于分组的DataFrame,并且自定义函数需要从原始DataFrame读取多列。

1 个答案:

答案 0 :(得分:0)

您可以使用自定义功能来实现此目的。

使用以下功能,您可以使用任何输入列创建任意数量的新列。

def f(x):
    t = {}
    t['max'] = (x['b']/x['c']).max()
    t['min'] = (x['b']/x['c']).min()
    return pd.Series(t)

mydf.groupby('a').apply(f)

输出:

        max       min
a                    
1  0.666667  0.666667
3  1.000000  0.666667