Python 关于pandas groupby中lambda运算符的澄清
我无法发表评论,因为我是stackoverflow的新手,所以不能直接在线程中提问,但我想在此澄清解决方案: 我理解多索引选择(级别0与级别1),但我不清楚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:
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