如何计算DISTINCT总数值占比?多选项统计场景下的占比计算方法
按独立用户维度计算症状占比的实现方案
统计逻辑说明
你需要的统计逻辑核心是把独立用户作为统计基准,而非单条记录,规则如下:
- 分母:全量去重的总用户数,包含没有选择任何症状的用户
- 分子:选择了对应症状的去重用户数,同一用户多次选择同一症状仅计数1次
- 占比计算公式:
(分子 / 分母) * 100%
代码实现示例
SQL 实现
假设你的表名为symptom_records,包含两个字段:person_id(用户唯一标识)、symptom(症状名称):
-- 统计所有症状对应的用户占比 SELECT symptom, -- 乘以100.0是为了避免整数除法截断结果 COUNT(DISTINCT person_id) * 100.0 / (SELECT COUNT(DISTINCT person_id) FROM symptom_records) AS user_percentage FROM symptom_records -- 若不需要展示「无任何症状」的统计项,可打开下方注释 -- WHERE symptom != 'no symptoms' GROUP BY symptom ORDER BY user_percentage DESC;
如果仅需要查询单个症状(比如症状A)的占比,可直接加过滤条件:
SELECT COUNT(DISTINCT person_id) * 100.0 / (SELECT COUNT(DISTINCT person_id) FROM symptom_records) AS symptom_a_percentage FROM symptom_records WHERE symptom = 'symptom A';
Python Pandas 实现
import pandas as pd # 示例数据构造 df = pd.DataFrame({ 'person_id': [1,1,2,2,2,3,4], 'symptom': ['symptom A','symptom B','symptom B','symptom C','symptom D','no symptoms','symptom A'] }) # 计算全量独立用户总数 total_user_cnt = df['person_id'].nunique() # 按症状分组统计独立用户占比 result = (df.groupby('symptom')['person_id'].nunique() / total_user_cnt * 100).round(2) print(result)
运行后症状A的输出结果为50,符合你的需求。
内容的提问来源于stack exchange,提问作者dataxxx
相关产品推荐
相关产品推荐

