pandas 用于计算平均值的平均值的Lambda函数

tag5nh1u  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(339)

我的 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)
kcugc4gi

kcugc4gi1#

从分组依据应用documentation
传递给apply的函数必须将 Dataframe 作为其第一个参数
提供给apply()的函数将整个组的 Dataframe 作为参数。因此,调用values.mean()将计算组中所有行/列的平均值。在方法#1中,您按第一个索引对 Dataframe 进行分组,然后为每个组计算每个组中所有行/值的平均值,然后将结果连接到一个系列中。

ssm49v7z

ssm49v7z2#

在Python中,lambda是匿名函数;因此,具有单独的功能没有区别,例如:

def first_mean(cormat):
    return cormat.values.mean()

mean1 = df.groupby(level='index1').apply(first_mean)

在匿名函数中:lambda cormat: cormat.values.mean()

  • cormat:参数名称
  • cormat.values.mean():返回值

换句话说,cormat只是一个名称,例如,我使用x(尽管它对代码可读性不好)。
使用lambda s的原因是方便,这家伙只是懒得自己定义一个单独的函数来计算第一个均值,传递了一个lambda
pandas的Angular 来看,.groupby()方法返回一个可迭代对象(tuple s的list),.apply()方法将该函数应用于可迭代对象的每一小部分。换句话说,您可以将整个.apply(lambda ...)部分编写如下:

def first_mean(cormat):
    return cormat.values.mean()

groups = df.groupby(level='index1')
t_dfs = []  # container to store each processed chunk of groupby
for name, group in groups:
    t_dfs.append(first_mean(group))

result = pd.concat(t_dfs)

希望这个有用。

wvt8vs2t

wvt8vs2t3#

首先,让我们考虑以下数据并查看输出:

data = {
    1 : [10,20,15,15],
    2 : [10,12,11,11]
}
df = pd.DataFrame(data)

mean = df.apply(lambda x: x.mean())
print(mean)

输出:
如你所知,一般来说,可以说lambda是一种关于行的for。(我不知道我在科学上有多正确,但这就是我的感觉)这就是为什么我们要在 Dataframe 上执行for时会出现很多次(特别是当我们处理条件表达式时)我们使用lambda。当我们运行类似df.apply(lambda x: x.mean())的程序时,它意味着在行上移动并给出行的平均值
这是您的 Dataframe :

0         1         2         3
index1 index2                                        
bar    one    -0.670105  0.007948  1.016790  0.539176
       two     0.025020  0.751342 -0.402003 -1.279099
baz    one    -0.379699  1.834577 -0.106809 -0.105114
       two     0.341889  0.697291  0.640217 -0.264288
foo    one     0.985640  1.079954 -1.079756 -0.252929
       two     0.559913  1.254874 -0.387722 -0.992791
qux    one    -0.192437 -0.522757 -0.638837  1.826321
       two    -2.106791 -0.280402  0.593201  0.824298

对于此代码,我们有以下输出:

#Method 1: Mean for the whole date
mean1 = df.groupby(level='index1').apply(lambda x: x.mean())

# MEthod 2: Mean of mean
mean2 = df.groupby(level=['index1']).mean().mean(axis=1)

print(mean1,'\n-----------------------------------------------\n',mean2)

输出:

0         1         2         3
index1                                        
bar    -0.322543  0.379645  0.307393 -0.369962
baz    -0.018905  1.265934  0.266704 -0.184701
foo     0.772776  1.167414 -0.733739 -0.622860
qux    -1.149614 -0.401579 -0.022818  1.325309 
-----------------------------------------------
 index1
bar   -0.001367
baz    0.332258
foo    0.145898
qux   -0.062175
dtype: float64

因此,似乎根据第二个指标,计算了平均值。
通过下面的代码,values的工作原理就很清楚了。

values = df.groupby(level='index1').apply(lambda x: x.values)
print(values[0])

输出:

[[-0.6701054   0.00794845  1.01678958  0.5391757 ]
 [ 0.02501959  0.75134187 -0.40200268 -1.27909938]]

现在也许更有意义一点:

#Method 1: Mean for the whole date
mean1 = df.groupby(level='index1').apply(lambda x: x.values.mean())

# MEthod 2: Mean of mean
mean2 = df.groupby(level=['index1']).mean().mean(axis=1)

print(mean1,'\n-----------------------------------------------\n',mean2)

输出:

index1
bar   -0.001367
baz    0.332258
foo    0.145898
qux   -0.062175
dtype: float64 
-----------------------------------------------
 index1
bar   -0.001367
baz    0.332258
foo    0.145898
qux   -0.062175
dtype: float64

相关问题