如何基于零值与非零值计算均值及分组统计非零值占比
按ID统计非零值占比的实现方法
下面针对你的需求,提供几种常用工具的实现方案:
1. SQL 方案
假设你的数据存储在名为your_table的数据库表中,执行以下SQL语句即可得到目标结果:
SELECT ID, COUNT(*) AS n, CONCAT(ROUND(SUM(CASE WHEN Released != 0 THEN 1 ELSE 0 END) / COUNT(*) * 100, 0), '%') AS RateReleased FROM your_table GROUP BY ID;
COUNT(*):统计每个ID对应的总记录数SUM(CASE WHEN Released != 0 THEN 1 ELSE 0 END):统计每个ID的非零值数量- 最后通过除法计算占比,用
ROUND取整、CONCAT拼接百分号,得到百分比格式的结果
2. Excel 方案
如果用Excel处理本地数据,按以下步骤操作:
- 提取唯一ID:在空白列(比如D列)输入
=UNIQUE(A:A),自动生成所有不重复的ID - 统计总条数n:在E2单元格输入
=COUNTIF(A:A, D2),下拉填充到所有ID行,得到每个ID的总记录数 - 计算非零值占比:在F2单元格输入
=COUNTIFS(A:A, D2, B:B, "<>0")/E2,下拉填充后,选中F列设置单元格格式为「百分比」(保留0位小数)
3. Python pandas 方案
用pandas库处理数据,代码示例如下:
import pandas as pd # 构造示例数据(实际可通过pd.read_csv读取本地文件) df = pd.DataFrame({ 'ID': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'Released': [2, 2, 0, 0, 20, 15, 9, 0] }) # 分组计算统计指标 result = df.groupby('ID').agg( n=('Released', 'count'), non_zero_count=('Released', lambda x: (x != 0).sum()) ).assign( RateReleased=lambda x: (x['non_zero_count'] / x['n'] * 100).astype(int).astype(str) + '%' ).drop('non_zero_count', axis=1).reset_index() print(result)
执行后会输出符合要求的统计结果,其中:
groupby('ID')按ID分组agg方法分别统计总记录数和非零值数量assign方法计算占比并转换为百分比字符串格式
内容的提问来源于stack exchange,提问作者BD'auria
相关产品推荐
相关产品推荐

