Python Pandas Agg(λx:np.mean(x==某物)

Python Pandas Agg(λx:np.mean(x==某物),python,pandas,Python,Pandas,请解释lambda函数是如何工作的 我知道星期一类是计数(2天)/(星期一总天数)。星期二也是如此 但我无法理解lambda和np.mean背后的逻辑 另外,为什么下面不返回上面的结果,例如:0.3333?谢谢 x==2为'Monday'(第0、4、5和8行)返回一个布尔数组,例如[True、False、False、False]。在np.mean中,这些布尔值被转换为[1、0、0、0],该数组的平均值为0.25 至于第二个问题:如果不分组,则x是每行的值,例如,第0行的2。2==2返回Tru

请解释lambda函数是如何工作的

我知道星期一类是计数(2天)/(星期一总天数)。星期二也是如此

但我无法理解lambda和np.mean背后的逻辑

另外,为什么下面不返回上面的结果,例如:0.3333?谢谢


x==2
'Monday'
(第0、4、5和8行)返回一个布尔数组,例如
[True、False、False、False]
。在
np.mean中,这些布尔值被转换为
[1、0、0、0]
,该数组的平均值为
0.25


至于第二个问题:如果不分组,则
x
是每行的值,例如,第0行的
2
2==2
返回
True
np.mean(True)==np.mean(1)==1.0

为了更好地了解发生了什么,您可以像这样输出
x

def agg_fun(x):
    print(f"--- called with {type(x).__name__} ---:\n{x}\n{'='*27}")
    return np.mean(x==2)

dd.agg(agg_fun)
要完全理解
agg
的行为,您必须仔细阅读以下内容:

用于聚合数据的函数。如果是函数,则必须 当传递给系列或传递给系列时工作。应用

事实上,函数首先应用于序列(即在每个元素上调用),并且只有在失败时才调用该函数,并将序列作为其参数,请参见。例如,以下示例:

s = pd.Series([1,2])
s.agg(lambda x: np.mean(x))
此功能可以应用,我们收到

0    1.0
1    2.0

相比之下,
s.agg(lambda x:x.mean())
(与
s.agg(np.mean)
相同)不能应用于一个系列(一个
int
没有属性
mean
),因此此错误被捕获,并再次尝试调用函数,以该系列作为参数。此操作没有错误,我们收到
1.5
x==2
返回布尔数组,例如
[True,False,False,False]
用于
'Monday'
(第0、4、5和8行)。在
np.mean
中,这些布尔值被转换为
[1,0,0,0]
,此数组的平均值为
0.25


至于第二个问题:如果不分组,则
x
是每行的值,例如,第0行的
2
2==2
返回
True
np.mean(True)==np.mean(1)==1.0

为了更好地了解发生了什么,您可以像这样输出
x

def agg_fun(x):
    print(f"--- called with {type(x).__name__} ---:\n{x}\n{'='*27}")
    return np.mean(x==2)

dd.agg(agg_fun)
要完全理解
agg
的行为,您必须仔细阅读以下内容:

用于聚合数据的函数。如果是函数,则必须 当传递给系列或传递给系列时工作。应用

事实上,函数首先应用于序列(即在每个元素上调用),并且只有在失败时才调用该函数,并将序列作为其参数,请参见。例如,以下示例:

s = pd.Series([1,2])
s.agg(lambda x: np.mean(x))
此功能可以应用,我们收到

0    1.0
1    2.0

相比之下,
s.agg(lambda x:x.mean())
(与
s.agg(np.mean)
相同)不能应用于一个系列(一个
int
没有属性
mean
),因此此错误被捕获,并再次尝试调用函数以序列作为参数。此操作正常,我们收到
1.5

您好,谢谢!请进一步解释为什么如果我不使用groupby,它不会返回相同的结果(请参阅我的编辑)?我希望它返回0.33333。嗨,谢谢,我的想法是。如果第一个例子,
df.groupby('Days')。agg(np.mean)
将返回周一的平均值,而第二个例子
dd.agg(np.mean)
还将返回整个序列的平均值。但是lambda x,它在groupby和未使用groupby时的行为不同。请再次解释为什么第一个使用groupby的示例中,lambda x将在周一和周二下返回布尔值列表?Thanks@josephgan当前位置请查看我的最新答案。谢谢您的时间和努力!!我是通过e第二个示例(没有groupby)。第一个示例还有一点需要确认的地方。因此,如果我使用groupby,调用的任何函数都将作为参数应用于整个系列。它不会查看单个行(不是因为它无法应用),因此
df.groupby('Days').agg(lambda x:np.mean(x==2))的逻辑
1.它首先在“天”内为每组创建序列2.Lambda x将为整个序列返回x==2的布尔值。3.然后np.mean将应用于整个序列。我的理解正确吗?谢谢!@josephgan是的,这是正确的。为了更好地诊断,我还对我的回答中的
agg_fun
进行了一些修改。嗨,谢谢!你能帮忙吗e进一步解释为什么如果我不使用groupby,它不会返回相同的结果(请参见我的编辑)?我希望它返回0.33333。嗨,谢谢,我的想法是。如果第一个示例,
df.groupby('Days').agg(np.mean)
将返回星期一的平均值,而第二个示例
dd.agg(np.mean)
还将返回整个序列的平均值。但是lambda x,它在groupby和未使用groupby时的行为不同。请再次解释为什么第一个使用groupby的示例中,lambda x将在周一和周二下返回布尔值列表?Thanks@josephgan当前位置请查看我的最新答案。谢谢您的时间和努力!!我是通过e第二个示例(没有groupby)。第一个示例还有一点需要确认的地方。因此,如果我使用groupby,调用的任何函数都将作为参数应用于整个系列。它不会查看单个行(不是因为它无法应用),因此
df.groupby('Days').agg(lambda x:np.mean(x==2))的逻辑
1.它首先在'Days'2中为每个组创建序列。Lambda x将为整个序列返回布尔值x==2。3.然后应用np.mean t