Python lambda函数语法,用于按数据帧转换数据

Python lambda函数语法,用于按数据帧转换数据,python,pandas,lambda,pandas-groupby,Python,Pandas,Lambda,Pandas Groupby,这应该是一个非常简单的问题来回答。我有两行代码。第一个有效。第二个给出了以下错误: SyntaxError: invalid syntax 下面是两行代码。第一行(工作正常)对off0_on1==1的行进行计数。第二个函数尝试计算off0_on1==0的行数 a1['on1'] = a1.groupby('del_month')['off0_on1'].transform(sum) a1['off0'] = a1.groupby('del_month')['off0_on1'].transfo

这应该是一个非常简单的问题来回答。我有两行代码。第一个有效。第二个给出了以下错误:

SyntaxError: invalid syntax
下面是两行代码。第一行(工作正常)对off0_on1==1的行进行计数。第二个函数尝试计算off0_on1==0的行数

a1['on1'] = a1.groupby('del_month')['off0_on1'].transform(sum)
a1['off0'] = a1.groupby('del_month')['off0_on1'].transform(lambda x: 1 if x == 0)
以下是熊猫数据框:

a1 = pd.DataFrame({'del_month':[1,1,1,1,2,2,2,2], 'off0_on1':[0,0,1,1,0,1,1,1]})
有没有修改上面第二行代码的建议

编辑: 其中两个答案建议使用map函数,该函数生成以下输出。“on1”列对我来说是正确的;“off0”列不正确。对于第一个“Delu月”,“off0”列的结果应与“on1”列的结果相同。第二个“德鲁月”的“off0”列应为全一(即1、1、1、1)

下面是我使用以下映射函数时发生的情况(请参见下图):

编辑2 不确定这是否澄清了问题,但最终我希望pandas能够轻松完成以下SQL代码所做的工作:

select
    del_month
    , sum(case when off0_on1 = 1 then 1 else 0 end) as on1
    , sum(case when off0_on1 = 0 then 1 else 0 end) as off0
from a1
group by del_month
order by del_month
编辑3
这包含了我需要的答案。谢谢大家

定义
if
语句(简写方式)时,还需要定义
else

lambda x: 1 if x == 0 else 0 # For example.
编辑:

在您的第一个lambda中,它实际上是一个系列,所以您需要循环它(以map为例)


如果x==0,则代码:
lambda x:1
不是有效的表达式。如果x==0,则尝试类似于
lambda x:1的方法,否则为0

见下文:

>>> example = lambda x: 1 if x == 0 else 0
>>> example(0)
1
>>> example(1)
0

前面的答案通过在末尾添加“else 0”很快修复了lambda函数错误。我的最终问题得到了以下代码的回答:

a1['off0'] = a1.groupby('del_month')['off0_on1'].transform(lambda x: sum(x==0)) 

如果x==0,则λx:1,否则为0
。有关更一般的详细信息,请参见a1['off0']=a1.groupby('del_month')['off0_on1'])。转换(如果x==0,则为lambda x:1,否则为0)会给出以下错误:value错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。有什么建议吗?谢谢我不确定
groupby
与本专栏有什么关联?为什么不能在未分组的DF上使用
np.where()
?我在这方面向您提出挑战的原因是
lambda x:1如果x==0,那么0
将作为Python
for
循环运行,即速度非常慢-不会比基本Python快,并且您有数百万条记录
numpy.where()
将快几个数量级。您应该真正检查以确保您使用
groupby
并为第二个操作传递
lambda
对输出至关重要;我不确定。如果这张照片不是你想要的,那我也不确定。但是看看你说的不正确的输出是如何完全独立于组的;我对这个问题的理解和其他回答者一样,完全不需要分组就可以实现。我尝试了以下方法:a1['off0']=a1.groupby('del_month')['off0_on1'].transform(lambda x:1如果x==0,则x=0,否则0),但得到了以下错误:ValueError:序列的真值是不明确的。使用a.empty、a.bool()、a.item()、a.any()或a.all()。有什么建议吗?谢谢@Sean_Calgary,为您的问题添加了一个编辑部分。我在问题中添加了一张图片,以显示map()建议产生的结果是可用的,但并不完全符合我的需要。再次感谢。也许我应该接受其中一个答案(因为他们解决了我最初的lambda语法问题),然后问第二个问题,关于如何对if进行分组然后求和,就像SQL“sum(case when…)”一样,这是我真正想做的。map()函数与简单的a1['off0']=numpy.where(a1.off0_on1==0,1,0)相同,但要复杂得多。我需要对结果进行分组,并按月进行汇总/计数;否则,我只使用numpy.where()。我尝试了以下方法:a1['off0']=a1.groupby('del_month')['off0_on1'].transform(lambda x:1如果x==0,则为0,否则为0),但得到了以下错误:ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。有什么建议吗?谢谢我相信你真的想绘制这个系列。当您要将行中的元素与0进行比较时,您的lambda正在将行与0进行比较。我会尝试
a1['off0']=a1.groupby('del_month')['off0_on1'].transform(lambda series:map(lambda elem:1如果x==0,则为0,则为0,series))
。我编辑了我的问题并添加了一张图片。map函数不是我想要的。最终,我可以使用它,但我希望我的“off0”列与我的“on1”列类似。也许我应该接受其中一个答案(因为它们解决了我最初的lambda语法问题),然后问第二个问题,关于如何分组,然后求和if,就像SQL“sum(case-when…”,这是我真正想要做的。map()函数与简单的a1['off0']=numpy.where(a1.off0_on1==0,1,0)相同,但要复杂得多。我需要对结果进行分组,并按月进行汇总/计数;否则我就使用numpy.where()。
>>> example = lambda x: 1 if x == 0 else 0
>>> example(0)
1
>>> example(1)
0
a1['off0'] = a1.groupby('del_month')['off0_on1'].transform(lambda x: sum(x==0))