Python 关于pandas groupby中lambda运算符的澄清

Python 关于pandas groupby中lambda运算符的澄清,python,pandas,lambda,Python,Pandas,Lambda,我无法发表评论,因为我是stackoverflow的新手,所以不能直接在线程中提问,但我想在此澄清解决方案: 我理解多索引选择(级别0与级别1),但我不清楚lambda函数中的每个x指的是什么。x.sum()中的x对我来说是指level=0(在level=0处对每个分组中的所有结果进行求和),但是100*x中的x似乎是指groupby对象中的每个单独结果(而不是索引level=0分组) 很抱歉提出了这样一个基本的问题,但解释一下会非常有用 这是州办公室数据框: state_office Out:

我无法发表评论,因为我是stackoverflow的新手,所以不能直接在线程中提问,但我想在此澄清解决方案:

我理解多索引选择(级别0与级别1),但我不清楚lambda函数中的每个
x
指的是什么。
x.sum()
中的
x
对我来说是指
level=0
(在
level=0
处对每个分组中的所有结果进行求和),但是
100*x
中的
x
似乎是指groupby对象中的每个单独结果(而不是索引
level=0
分组)


很抱歉提出了这样一个基本的问题,但解释一下会非常有用

这是
州办公室
数据框:

state_office
Out: 
                  sales
state office_id        
AZ    2          589661
      4          339834
      6          201054
CA    1          760950
      3          935865
      5          464993
CO    1          737207
      3          154900
      5          277555
WA    2          510215
      4          640508
      6          557411
如果按级别=0对该组进行分组,则该组将为:

                  sales
state office_id        
AZ    2          589661
      4          339834
      6          201054



将groupby.apply与自定义函数一起使用时,这些组将成为此函数的输入(
x
在lambda x中)。我将使用术语
group
,而不是x来更加明确

让你困惑的事情叫做广播。如果对特定组使用
group/group.sum()
,则该组中的每个元素都将除以总和。我们来看第一组:

                  sales
state office_id        
AZ    2          589661
      4          339834
      6          201054
group.sum()
返回:

group.sum()
Out: 
sales    1130549
dtype: int64
由于它只有一个元素,
float(x.sum())
将返回1130549.0。(更简洁的版本是在GroupBy对象上选择销售系列,然后应用函数。
state\u office.GroupBy(level=0)['sales'].apply(lambda x:100*x/x.sum())
这里,
x
是一个系列,因此
x.sum()
将是一个标量,因此您不需要
float(x.sum())

如果将每个元素除以此值,则会得到所需的结果:

group / group.sum()
Out: 
                    sales
state office_id          
AZ    2          0.521570
      4          0.300592
      6          0.177837

pandas/numpy在这一点上指出,如果形状不相同,但有一个共同的轴,则应根据该轴进行操作(更基本地说,如果您传递三个数字,那么它将执行元素除法,但由于您只传递一个数字,因此它知道您希望将这三个数字中的每一个都除以这个数字)。

让我们一起阅读文档

GroupBy.apply(func,*args,**kwargs)[来源]apply函数func 分组并将结果组合在一起

从上面的签名查看
func

func:函数

将数据帧作为其第一个参数的可调用函数,并返回 数据帧、序列或标量。此外,可调用的 位置参数和关键字参数


在OP的例子中,
lambda x:100*x/float(x.sum()
在文档中是
func
。从文档中,
x
这里是一个数据帧,是在
groupby
呼叫之后的一组组。

理解-非常感谢您提供的详细信息,非常感谢!@jbachlombardo很高兴能提供帮助。:)
                  sales
state office_id        
AZ    2          589661
      4          339834
      6          201054
group.sum()
Out: 
sales    1130549
dtype: int64
group / group.sum()
Out: 
                    sales
state office_id          
AZ    2          0.521570
      4          0.300592
      6          0.177837