Python实现:按指定公差级别统计DataFrame各列ID数量
需求说明
现有存储在DataFrame中的表格如下:
| ID | A | B | C |
|---|---|---|---|
| 1 | 0% | 1% | 5% |
| 3 | 10% | 30% | 50% |
| 6 | 100% | 300% | 500% |
| 7 | 700% | 900% | 50% |
| 10 | 10% | 30% | 50% |
需基于公差级别数组 tolerance_level = [0, 1, 5, 10, 20, 30, 50, 100, 200, 300, 500, 700],统计A、B、C列中各公差级别的ID数量:
- 若列中百分比数值在公差级别列表内,直接归至对应级别统计
- 若数值不在列表中,归至最近的公差级别;若数值大于列表最大值(700),归至
>700%级别
解决方案
实现步骤
- 数据预处理:将表格中的百分比字符串转换为整数数值,去除百分号
- 级别映射:定义函数将每个数值匹配到对应公差级别,处理超出最大值的情况
- 统计计数:对每一列的级别映射结果进行计数,整理成目标格式的DataFrame
代码实现
import pandas as pd import numpy as np # 初始化原始数据 raw_data = { 'ID': [1, 3, 6, 7, 10], 'A': ['0%', '10%', '100%', '700%', '10%'], 'B': ['1%', '30%', '300%', '900%', '30%'], 'C': ['5%', '50%', '500%', '50%', '50%'] } df = pd.DataFrame(raw_data) # 定义公差级别及对应标签 tolerance_level = [0, 1, 5, 10, 20, 30, 50, 100, 200, 300, 500, 700] level_labels = [f'{x}%' for x in tolerance_level] + ['>700%'] # 预处理:将百分比字符串转为整数 for col in ['A', 'B', 'C']: df[col] = df[col].str.rstrip('%').astype(int) # 定义数值到公差级别的映射函数 def map_to_tolerance(value): max_level = max(tolerance_level) if value > max_level: return '>700%' # 找到最接近的公差级别 closest_idx = np.argmin(np.abs(np.array(tolerance_level) - value)) return f'{tolerance_level[closest_idx]}%' # 统计各列的级别数量 result_data = {'tolerance_level': level_labels} for col in ['A', 'B', 'C']: mapped_levels = df[col].apply(map_to_tolerance) # 按完整级别标签统计,缺失的级别补0 count_result = mapped_levels.value_counts().reindex(level_labels, fill_value=0) result_data[col] = count_result.values # 生成结果DataFrame result_df = pd.DataFrame(result_data) print(result_df)
运行结果
执行代码后得到的真实统计结果如下:
| tolerance_level | A | B | C |
|---|---|---|---|
| 0% | 1 | 0 | 0 |
| 1% | 0 | 1 | 0 |
| 5% | 0 | 0 | 1 |
| 10% | 2 | 0 | 0 |
| 20% | 0 | 0 | 0 |
| 30% | 0 | 2 | 0 |
| 50% | 0 | 0 | 3 |
| 100% | 1 | 0 | 0 |
| 200% | 0 | 0 | 0 |
| 300% | 0 | 1 | 0 |
| 500% | 0 | 0 | 1 |
| 700% | 1 | 0 | 0 |
| >700% | 0 | 1 | 0 |
内容的提问来源于stack exchange,提问作者testenthu
相关产品推荐
相关产品推荐

