Python 将函数按组应用于数据帧中的每一列

Python 将函数按组应用于数据帧中的每一列,python,python-3.x,pandas,Python,Python 3.x,Pandas,我想对我的数据帧的每一列应用一个函数,但要按组进行(MWE如下)。有没有比我更优雅的方法 import numpy as np import pandas as pd df1 = pd.DataFrame(data = {"a": [1,2,3,4,5], "b": [6,7,8,9,10]}, index = pd.Index([0,0,0,1,1], name="someindex")) df1.groupby("someindex").apply(lambda g: g.apply(lam

我想对我的
数据帧的每一列应用一个函数,但要按组进行(MWE如下)。有没有比我更优雅的方法

import numpy as np
import pandas as pd
df1 = pd.DataFrame(data = {"a": [1,2,3,4,5], "b": [6,7,8,9,10]}, index = pd.Index([0,0,0,1,1], name="someindex"))
df1.groupby("someindex").apply(lambda g: g.apply(lambda x: np.average(x)))

这只是一个简单的例子,但我所拥有的通用性水平是,函数可以返回与组相同的形状,但在计算中使用所有元素(例如,标准化列)。

您只需执行
groupby.mean

df1.groupby("someindex").mean()
这将按组计算所有数值列的平均值

或者对于一般函数,如果它本质上是聚合,
groupby.agg
可以为您节省一些
lambda
s:

df1.groupby("someindex").agg(np.average)

根据函数的通用性,我想有些情况下您无法简化解决方案

以下是更简洁的处理方法(例如我的标准化列的示例)。我先发布
apply
方式,然后发布
transform
方式(这是更简洁的方式)


我想用一个普通的函数,意思只是一个玩具的例子…我想这取决于你用的是什么样的函数。如果你能更明确的说出来,这会很有帮助。我只是在和熊猫玩耍,但我所想到的一般性水平是一个函数,它返回与组相同的形状。所以,也许有一个标准化了每一列,例如,不清楚你的意思是什么,返回的是和组相同的形状@Psidom的答案准确地返回您的帖子,而且更简洁。
#verbose
df1.groupby("someindex").apply(lambda x: x.apply(lambda y: (y - y.mean())/y.std()))

#clear
df1.groupby("someindex").transform(lambda x: (x - x.mean())/x.std())