Pandas+sqldf如何计算50岁+男性、40岁+女性合计存活率
泰坦尼克数据集指定人群存活率计算方案
缺失值填充不生效的原因
- 你之前拆分出
df_Mr_survived、df_Mr_died等4个数据分片后单独做fillna操作,修改的只是分片数据,不会同步到原始的df_titanic表。后续统计查询是直接读取未处理缺失值的df_titanic,Age为空的记录会被WHERE条件直接过滤,最终统计结果会有偏差。 - 正确的预处理方式是直接在原始数据集上完成Age字段填充,参考代码:
# 可根据需求替换为分组均值等其他填充逻辑 df_titanic["Age"] = df_titanic["Age"].fillna(df_titanic["Age"].mean())
填充完成后再执行sqldf查询,填充值就会正常生效。
单条查询计算合计存活率
你之前的查询只统计了符合条件的存活人数,缺少符合筛选条件的总人数统计,因此无法算出存活率占比。使用你已掌握的WHERE语法即可单条语句输出结果,不需要复杂操作:
存活率计算逻辑:指定人群的存活人数 / 指定人群总人数,计算时注意将分子转为浮点型,避免整数相除得到错误的整数结果。
total_survival_res = sqldf(""" SELECT SUM(CASE WHEN Survived = 1 THEN 1 ELSE 0 END) AS survived_total, COUNT(*) AS people_total, ROUND( CAST(SUM(CASE WHEN Survived = 1 THEN 1 ELSE 0 END) AS FLOAT) / COUNT(*), 4 ) AS total_survival_rate FROM df_titanic WHERE (Sex = 'male' AND Age >= 50) OR (Sex = 'female' AND Age >= 40) """)
返回结果中total_survival_rate就是你需要的两类人群合计存活率,结果保留4位小数。
分群体计算存活率(使用GROUP BY/HAVING)
如果需要分别查看两类人群的各自存活率,可以用你熟悉的GROUP BY语法实现,需要筛选特定存活率的分组时追加HAVING条件即可:
group_survival_res = sqldf(""" SELECT CASE WHEN Sex = 'male' AND Age >= 50 THEN '50岁及以上男性' WHEN Sex = 'female' AND Age >= 40 THEN '40岁及以上女性' END AS group_name, SUM(CASE WHEN Survived = 1 THEN 1 ELSE 0 END) AS survived_total, COUNT(*) AS people_total, ROUND( CAST(SUM(CASE WHEN Survived = 1 THEN 1 ELSE 0 END) AS FLOAT) / COUNT(*), 4 ) AS group_survival_rate FROM df_titanic WHERE (Sex = 'male' AND Age >= 50) OR (Sex = 'female' AND Age >= 40) GROUP BY group_name -- 示例:如果只需要展示存活率高于50%的分组,取消下面一行注释即可 -- HAVING group_survival_rate > 0.5 """)
内容的提问来源于stack exchange,提问作者paru
相关产品推荐
相关产品推荐

