python - 用于转换熊猫 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 这个新问题包含我需要的答案。谢谢大家!
解决方案
当您定义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))
推荐阅读
- tinymce - tinyMCE 编辑器将本地化路径设置为上传图像的 src
- apache-spark-sql - Spark 连接 - 保存为数据帧或分区配置单元表
- javascript - 在 NodeJS 中传递图像文件参数
- java - 设置和获取 NdefRecord ID
- javascript - 在页面准备好之前动态加载 WebComponents Polyfill
- javascript - 映射对象并将键推送到 ES6 中的值
- informatica-cloud - Informatica Cloud - 来自 dat 文件的空字符问题
- amazon-web-services - 从 AWS Lambda 在 EC2 上运行 exe 文件
- php - 我可以使用带有计数器的 for 循环来初始化变量吗?
- extjs - Extjs 在 getClass 中获取 actioncolum 项目属性