当前接受的答案的后半部分已过时,并且有两个过时的建议。首先也是最重要的是,你不能再将字典词典传递给
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)