Python-将多个功能应用于多个groupby列

Python-将多个功能应用于多个groupby列,第1张

Python-将多个功能应用于多个groupby列

当前接受的答案的后半部分已过时,并且有两个过时的建议。首先也是最重要的是,你不能再将字典词典传递

agggroupby
方法。第二,永远不要使用
.ix

如果你希望同时使用两个单独的列,我建议使用

apply
隐式将
Dataframe
传递给应用函数的方法。让我们使用与上面类似的数据框

df = pd.Dataframe(np.random.rand(4,4), columns=list('abcd'))df['group'] = [0, 0, 1, 1]df          a         b         c         d  group0  0.418500  0.030955  0.874869  0.145641      01  0.446069  0.901153  0.095052  0.487040      02  0.843026  0.936169  0.926090  0.041722      13  0.635846  0.439175  0.828787  0.714123      1从列名映射到聚合函数的字典仍然是执行聚合的理想方法。df.groupby('group').agg({'a':['sum', 'max'],    'b':'mean',    'c':'sum',    'd': lambda x: x.max() - x.min()})   a        b         c         d sum       max      mean       sum  <lambda>group      0      0.864569  0.446069  0.466054  0.969921  0.3413991      1.478872  0.843026  0.687672  1.754877  0.672401

如果你不喜欢该丑陋的lambda列名称,则可以使用常规函数,并为特殊

__name__
属性提供自定义名称,如下所示:

def max_min(x):    return x.max() - x.min()max_min.__name__ = 'Max minus Min'df.groupby('group').agg({'a':['sum', 'max'],    'b':'mean',    'c':'sum',    'd': max_min})   a        b         c  d sum       max      mean       sum Max minus Mingroup          0      0.864569  0.446069  0.466054  0.969921      0.3413991      1.478872  0.843026  0.687672  1.754877      0.672401

使用apply和返回系列

现在,如果有多个需要一起交互的列,则不能使用

agg
,这会将
Series
隐式传递给聚合函数。当
apply
将整个组用作
Dataframe
时,将传递给函数。

我建议创建一个自定义函数,以返回一系列所有聚合。使用系列索引作为新列的标签:

def f(x):    d = {}    d['a_sum'] = x['a'].sum()    d['a_max'] = x['a'].max()    d['b_mean'] = x['b'].mean()    d['c_d_prodsum'] = (x['c'] * x['d']).sum()    return pd.Series(d, index=['a_sum', 'a_max', 'b_mean', 'c_d_prodsum'])df.groupby('group').apply(f)         a_sum     a_max    b_mean  c_d_prodsumgroup          0      0.864569  0.446069  0.466054     0.1737111      1.478872  0.843026  0.687672     0.630494

如果你爱上了MultiIndexes,仍然可以返回带有以下内容的Series:

    def f_mi(x):        d = []        d.append(x['a'].sum())        d.append(x['a'].max())        d.append(x['b'].mean())        d.append((x['c'] * x['d']).sum())        return pd.Series(d, index=[['a', 'a', 'b', 'c_d'],   ['sum', 'max', 'mean', 'prodsum']])df.groupby('group').apply(f_mi)   a        b       c_d sum       max      mean   prodsumgroup       0      0.864569  0.446069  0.466054  0.1737111      1.478872  0.843026  0.687672  0.630494


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5036127.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存