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

该文档展示了如何使用输出列名称作为键的字典一次在groupby对象上应用多个功能:

In [563]: grouped['D'].agg({'result1' : np.sum,

.....: 'result2' : np.mean})

.....:

Out[563]:

result2 result1

A

bar -0.579846 -1.739537

foo -0.280588 -1.402938

但是,这仅适用于Series groupby对象。同样,当将字典类似地传递到groupby DataFrame时,它期望键是将应用该函数的列名。

我想做的是对多个列应用多个功能(但是某些列将被多次操作)。同样,某些函数将依赖于groupby对象中的其他列(如sumif函数)。我当前的解决方案是逐列进行操作,并使用类似于上面代码的代码,对依赖其他行的函数使用lambda。但这要花费很长时间,(我认为花很长时间来遍历groupby对象)。我必须对其进行更改,以便一次运行即可遍历整个groupby对象,但是我想知道熊猫中是否有内置的方法可以使此操作更加简洁。

例如,我尝试过类似

grouped.agg({'C_sum' : lambda x: x['C'].sum(),

'C_std': lambda x: x['C'].std(),

'D_sum' : lambda x: x['D'].sum()},

'D_sumifC3': lambda x: x['D'][x['C'] == 3].sum(), ...)

但正如我所料,我收到一个KeyError(因为如果agg从DataFrame调用,则键必须是一列)。

是否有任何内置方法可以执行我想做的事情,或者可能添加了此功能,或者我只需要手动遍历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 group

0 0.418500 0.030955 0.874869 0.145641 0

1 0.446069 0.901153 0.095052 0.487040 0

2 0.843026 0.936169 0.926090 0.041722 1

3 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.341399

1 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 Min

group

0 0.864569 0.446069 0.466054 0.969921 0.341399

1 1.478872 0.843026 0.687672 1.754877 0.672401

现在,如果有多个需要一起交互的列,则不能使用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_prodsum

group

0 0.864569 0.446069 0.466054 0.173711

1 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 prodsum

group

0 0.864569 0.446069 0.466054 0.173711

1 1.478872 0.843026 0.687672 0.630494

以上是 Python-将多个功能应用于多个groupby列 的全部内容, 来源链接: utcz.com/qa/431831.html

回到顶部