pandas sqldf计算fail_perc时除法返回全0的问题解决
sqldf 查询除法结果全为0 解决方案
问题根源
pandas 的 sqldf 底层依托 SQLite 引擎执行查询逻辑,SQLite 对两个整数类型值的除法运算默认走整数截断规则,不会自动保留小数部分。
只要分子数值小于分母,整数除法会直接把结果截断为0——哪怕单独取分子、分母的数值都准确,只要触发整数除法的判定,后续乘100得到的结果也会全程为0,和你遇到的现象完全吻合。这个坑是SQLite的规则特性导致的,换到其他支持隐式浮点转换的数据库引擎上不会出现这类问题。
可直接落地的修复方法
不需要改动原有查询的表结构、列选择逻辑,只需要调整 CASE 语句内的除法计算逻辑,打破整数运算的类型链路即可,两种写法任选其一:
- 写法1:在分子侧乘浮点常数
1.0,强制触发浮点运算
调整后的完整可运行代码为:ps.sqldf("select [MCA Governance Entity], [Assessment Unit] ,fail_cnt ,pass_cnt ,na_cnt," "case when fail_cnt <>0 then pass_cnt * 1.0 / (pass_cnt + fail_cnt)*100 else 0 end fail_perc from df7",locals()) - 写法2:用SQLite内置类型转换函数,把分子显式转为实数类型
调整后的 CASE 计算片段为:case when fail_cnt <>0 then CAST(pass_cnt AS REAL) / (pass_cnt + fail_cnt)*100 else 0 end fail_perc
内容的提问来源于stack exchange,提问作者user15780176
相关产品推荐
相关产品推荐

