我的 Dataframe 有2个级别的索引,我可以使用平均值方法mean2 = df.groupby(level=['index1']).mean().mean(axis=1)
计算每个主索引的平均值。我看到另一个方法使用lambda函数,它的结果相同。我只是不明白apply(lambda)
内部发生了什么。
任何解释都非常感谢。
import numpy as np
arrays = [
np.array(["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"]),
np.array(["one", "two", "one", "two", "one", "two", "one", "two"]),
]
s = pd.Series(np.random.randn(8), index=arrays)
df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
df.index.names = ['index1', 'index2']
df
#Method 1: Mean for the whole date
mean1 = df.groupby(level='index1').apply(lambda cormat: cormat.values.mean())
# MEthod 2: Mean of mean
mean2 = df.groupby(level=['index1']).mean().mean(axis=1)
print(mean1,mean2)
3条答案
按热度按时间kcugc4gi1#
从分组依据应用documentation:
传递给apply的函数必须将 Dataframe 作为其第一个参数
提供给
apply()
的函数将整个组的 Dataframe 作为参数。因此,调用values.mean()
将计算组中所有行/列的平均值。在方法#1中,您按第一个索引对 Dataframe 进行分组,然后为每个组计算每个组中所有行/值的平均值,然后将结果连接到一个系列中。ssm49v7z2#
在Python中,
lambda
是匿名函数;因此,具有单独的功能没有区别,例如:在匿名函数中:
lambda cormat: cormat.values.mean()
cormat
:参数名称cormat.values.mean()
:返回值换句话说,
cormat
只是一个名称,例如,我使用x
(尽管它对代码可读性不好)。使用
lambda
s的原因是方便,这家伙只是懒得自己定义一个单独的函数来计算第一个均值,传递了一个lambda
。从
pandas
的Angular 来看,.groupby()
方法返回一个可迭代对象(tuple
s的list
),.apply()
方法将该函数应用于可迭代对象的每一小部分。换句话说,您可以将整个.apply(lambda ...)
部分编写如下:希望这个有用。
wvt8vs2t3#
首先,让我们考虑以下数据并查看输出:
输出:
如你所知,一般来说,可以说lambda是一种关于行的
for
。(我不知道我在科学上有多正确,但这就是我的感觉)这就是为什么我们要在 Dataframe 上执行for
时会出现很多次(特别是当我们处理条件表达式时)我们使用lambda。当我们运行类似df.apply(lambda x: x.mean())
的程序时,它意味着在行上移动并给出行的平均值这是您的 Dataframe :
对于此代码,我们有以下输出:
输出:
因此,似乎根据第二个指标,计算了平均值。
通过下面的代码,
values
的工作原理就很清楚了。输出:
现在也许更有意义一点:
输出: