Python lambda函数语法可转换pandas groupby数据框

时间:2018-11-01 16:05:31

标签: 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'].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]})

是否有修改上述第二行代码的建议?

编辑: 使用映射函数建议了两个答案,该函数会产生以下输出。 “ on1”列对我而言是正确的; “ off0”列不正确。对于第一个“ del_month”,“ off0”列的结果应与“ on1”列的结果相同。对于第二个“ del_month”,“ off0”列应全部为1(即1、1、1、1)。

当我使用以下地图函数(见下图)时,会发生以下情况:

a1['off0'] = a1.groupby('del_month')['off0_on1'].transform(lambda series: map(lambda x: 1 if x == 0 else 0, series))

enter image description here

编辑2 不知道这是否可以澄清事情,但是最终我希望熊猫能够轻松地执行以下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 new question包含我需要的答案。谢谢大家!

3 个答案:

答案 0 :(得分:2)

在定义launchwin.*语句(简写)时,您还需要定义if

else

编辑:

在您的第一个lambda中,它实际上是一个系列,因此您需要循环播放它(例如,带有地图)

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

答案 1 :(得分:1)

您的代码:lambda x: 1 if x == 0不是有效的表达式。尝试类似lambda x: 1 if x == 0 else 0

参见下文:

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

答案 2 :(得分:0)

先前的答案通过在末尾添加“ else 0”,迅速解决了我的lambda函数错误。 here用下面的代码行回答了我的最终问题:

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