如何按属性分组统计特定属性值的出现次数(排除0值)
需求说明
- 按
attribute维度分组 - 统计各attribute对应值的出现频次,统计时排除值为0的记录
- 使用的数据集预览:

- 期望输出结果格式:
| Attribute | Count of |
|---|---|
| Q5_1 | 0 |
| Q5_2 | 3 |
| Q5_3 | 1 |
| Q5_4 | 1 |
| Q5_5 | 0 |
| Q5_6 | 0 |
| Q5_7 | 0 |
实现方案
Python Pandas 方案
适用于本地文件(Excel/CSV等)数据集处理,代码如下:
import pandas as pd # 替换为实际的数据读取代码,例如df = pd.read_csv("your_data.csv") df = pd.read_your_dataset() # 提取所有Q5开头的属性列 attribute_cols = [col for col in df.columns if col.startswith("Q5_")] # 逐列统计非0值数量 stat_result = pd.DataFrame({ "Attribute": attribute_cols, "Count of": [(df[col] != 0).sum() for col in attribute_cols] }) # 打印或导出结果 print(stat_result)
执行后输出结果和预期格式完全匹配。
SQL 方案
如果数据存储在数据库中,分两种表结构处理:
- 长表结构(表中存在
attribute字段存储Q5_x类属性名,val字段存储对应数值)
SELECT attribute AS Attribute, SUM(IF(val != 0, 1, 0)) AS `Count of` FROM your_table_name WHERE attribute LIKE 'Q5_%' GROUP BY attribute ORDER BY attribute;
- 宽表结构(每个Q5_x为独立列),先逆透视成长表再统计,以MySQL为例:
SELECT attribute AS Attribute, SUM(IF(val != 0, 1, 0)) AS `Count of` FROM ( SELECT 'Q5_1' attribute, Q5_1 val FROM your_table_name UNION ALL SELECT 'Q5_2', Q5_2 FROM your_table_name UNION ALL SELECT 'Q5_3', Q5_3 FROM your_table_name UNION ALL SELECT 'Q5_4', Q5_4 FROM your_table_name UNION ALL SELECT 'Q5_5', Q5_5 FROM your_table_name UNION ALL SELECT 'Q5_6', Q5_6 FROM your_table_name UNION ALL SELECT 'Q5_7', Q5_7 FROM your_table_name ) t GROUP BY attribute ORDER BY attribute;
内容的提问来源于stack exchange,提问作者Žan Fras
相关产品推荐
相关产品推荐

