首页 > 解决方案 > 用于转换熊猫 groupby 数据帧的 Python lambda 函数语法

问题描述

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

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”列不正确。对于第一个“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))

在此处输入图像描述

编辑 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 这个新问题包含我需要的答案。谢谢大家!

标签: pythonpandaslambdapandas-groupby

解决方案


当您定义if语句(速记方式)时,您还需要定义else

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

编辑:

在你的第一个 lambda 实际上是一个系列,所以你需要循环它(例如地图)

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

推荐阅读