gpt4 book ai didi

python - 将多个函数应用于多个 groupby 列

转载 作者:太空宇宙 更新时间:2023-11-03 19:50:11 26 4
gpt4 key购买 nike

docs展示如何使用以输出列名称作为键的字典一次对 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 对象,但我想知道 pandas 中是否有内置方法可以干净地完成此操作。

例如,我尝试过类似的方法

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 (因为如果从 DataFrame 调用 agg ,键必须是一列)。

是否有任何内置方法可以完成我想做的事情,或者可以添加此功能,或者我只需要手动迭代 groupby ?

最佳答案

当前接受的答案的后半部分已经过时,并且有两个弃用。首先也是最重要的是,您不能再将字典的字典传递给 agg groupby 方法。其次,切勿使用 .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
<小时/>

使用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_prodsum
group
0 0.864569 0.446069 0.466054 0.173711
1 1.478872 0.843026 0.687672 0.630494

如果您喜欢 MultiIndexes,您仍然可以返回一个系列,如下所示:

    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 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com