Conditional count Measure:基于ID的OpID条件计数需求
按规则统计OpID的出现次数
原始数据
| ID | OpID |
|---|---|
| 10 | 1 |
| 10 | 2 |
| 10 | 4 |
| 11 | null |
| 12 | 3 |
| 12 | 4 |
| 13 | 1 |
| 13 | 2 |
| 13 | 3 |
| 14 | 2 |
| 14 | 4 |
统计规则
- OpID=4代表同时包含OpID=1和OpID=2
- 若某ID已包含OpID=1和2,即使存在OpID=4也不重复计数
- 若某ID存在OpID=4但仅包含1(或2),则需为2(或1)的计数加1
- 需先对ID和OpID执行
groupby去重,处理重复数据
预期结果
| OpID | Count |
|---|---|
| 1 | 4 |
| 2 | 4 |
| 3 | 2 |
实现方案(Python Pandas)
步骤1:数据预处理(去重)
先对ID和OpID分组去重,保留每个ID对应的唯一OpID:
import pandas as pd # 构造原始数据 data = pd.DataFrame({ 'ID': [10,10,10,11,12,12,13,13,13,14,14], 'OpID': [1,2,4,None,3,4,1,2,3,2,4] }) # 去重:按ID和OpID分组,保留唯一记录 unique_data = data.groupby(['ID', 'OpID']).size().reset_index().drop(columns=0)
步骤2:按ID聚合OpID列表
将每个ID对应的所有OpID整理成列表,方便后续规则判断:
id_op_map = unique_data.groupby('ID')['OpID'].apply(list).to_dict()
步骤3:按规则统计计数
初始化计数,遍历每个ID的OpID列表,按规则更新计数:
counts = {'1':0, '2':0, '3':0} for ops in id_op_map.values(): # 过滤null值 valid_ops = [op for op in ops if pd.notna(op)] has_1 = 1 in valid_ops has_2 = 2 in valid_ops has_4 = 4 in valid_ops has_3 = 3 in valid_ops # 统计OpID=3 if has_3: counts['3'] +=1 # 处理OpID=1和2的统计逻辑 if has_1 and has_2: counts['1'] +=1 counts['2'] +=1 elif has_4: # 存在4但缺1或2,补全计数 counts['1'] +=1 counts['2'] +=1 elif has_1: counts['1'] +=1 elif has_2: counts['2'] +=1
步骤4:整理成结果表格
result = pd.DataFrame({'OpID': ['1','2','3'], 'Count': [counts['1'], counts['2'], counts['3']]}) print(result.to_markdown(index=False))
运行后输出结果与预期完全一致:
| OpID | Count | |------|-------| | 1 | 4 | | 2 | 4 | | 3 | 2 |
内容的提问来源于stack exchange,提问作者hjun
相关产品推荐
相关产品推荐

