在pandas中按组应用函数到DataFrame的每一列

时间:2018-04-05 00:22:18

标签: python python-3.x pandas

我想将函数应用于DataFrame的每一列,但按组(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)))

这只是一个玩具示例,但我的普遍性是一个函数可以返回与组相同的形状,但使用计算中的所有元素(例如,标准化列)。

2 个答案:

答案 0 :(得分:1)

您可以groupby.mean

df1.groupby("someindex").mean()

按组计算所有数字列的平均值。

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

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

根据功能的一般情况,我猜有些情况下你无法简化解决方案

答案 1 :(得分:0)

这是更简洁的做事方式(我的标准化列的例子)。我发布了apply方式,然后是transform方式(这是更简洁的方式)。

#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())