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
将作为Pythonfor
循环运行,即速度非常慢-不会比基本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))