You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Conditional count Measure:基于ID的OpID条件计数需求

按规则统计OpID的出现次数

原始数据

IDOpID
101
102
104
11null
123
124
131
132
133
142
144

统计规则

  • OpID=4代表同时包含OpID=1和OpID=2
  • 若某ID已包含OpID=1和2,即使存在OpID=4也不重复计数
  • 若某ID存在OpID=4但仅包含1(或2),则需为2(或1)的计数加1
  • 需先对ID和OpID执行groupby去重,处理重复数据

预期结果

OpIDCount
14
24
32

实现方案(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:15:29