【发布时间】:2019-04-06 00:31:19
【问题描述】:
我需要用 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
这是一个示例,说明性的熊猫数据框:
a1 = pd.DataFrame({'del_month':[1,1,1,1,2,2,2,2], 'off0_on1':[0,0,1,1,0,1,1,1]})
这是我用 pandas 重现上述 SQL 的尝试。第一行有效。第二行报错:
a1['on1'] = a1.groupby('del_month')['off0_on1'].transform(sum)
a1['off0'] = a1.groupby('del_month')['off0_on1'].transform(sum(lambda x: 1 if x == 0 else 0))
这是第二行的错误:
TypeError: 'function' object is not iterable
这个previous question of mine 的 lambda 函数有问题,已解决。更大的问题是如何在分组数据上重现 SQL 的“sum(case when)”逻辑。我正在寻找一个通用的解决方案,因为我需要经常做这种事情。我上一个问题中的答案建议在 lambda 函数中使用 map(),但是“off0”列的以下结果不是我需要的。 “on1”列是我想要的。整个组的答案应该是相同的(即“del_month”)。
【问题讨论】:
标签: python sql pandas lambda pandas-groupby