流程挖掘场景下按ID统计分类值的第n次出现次数
解决流程挖掘中按ID统计Activity出现次数的问题
我明白你要的是每个ID分组内,相同Activity的出现次数——也就是对每个ID下的Activity,标记它是该Activity在这个ID里的第几次出现,而不是按活动切换的累计计数。你之前用的代码是统计连续活动的切换次数,所以才不符合需求。
问题分析
你之前的代码:
df.groupby(["ID"])["Activity"].apply(lambda x : (x!=x.shift()).cumsum())
这段代码的作用是,对每个ID下的Activity序列,每当当前活动和上一个不同时,累计数加1。它统计的是「流程步骤的阶段数」(比如从Diagnosis到ID Process算一个新阶段),而不是同一个Activity的重复出现次数,所以得到的结果和你想要的不一致。
正确解决方案
我们需要同时按ID和Activity分组,然后对每个分组内的行进行计数。具体可以用cumcount()方法,它会为每个分组内的行生成从0开始的递增序号,加1后就是从1开始的出现次数。
完整代码示例:
import pandas as pd # 构造你的数据集(如果已有DataFrame可跳过这步) data = { "ID": [161,161,161,161,161,161,161,162,162,162,162,162,163,163,163,163,163,164,164,164,164,164,165,165,165,165,166,166,166,166,166,166,166,166,167,167,167,167,167,168,168,168,168,168,168,168,169,169,169,169], "Activity": ["Diagnosis","ID Process","Dead Air","ID Process","Dead Air","ID Process","Resolution","Diagnosis","ID Process","Dead Air","ID Process","Resolution","Diagnosis","ID Process","Resolution","Dead Air","Resolution","Diagnosis","ID Process","Investigation","On Hold","Resolution","Diagnosis","ID Process","Investigation","Resolution","Diagnosis","ID Process","Dead Air","ID Process","Resolution","On Hold","Resolution","On Hold","Diagnosis","ID Process","Dead Air","ID Process","Resolution","Diagnosis","ID Process","Investigation","Dead Air","Investigation","Resolution","On Hold","Diagnosis","Resolution","Investigation","ID Process"] } df = pd.DataFrame(data) # 计算每个ID下Activity的出现次数 df["Occurrence"] = df.groupby(["ID", "Activity"]).cumcount() + 1 # 输出你需要的结果列表 print(df["Occurrence"].tolist())
结果验证
运行上述代码后,输出的列表和你期望的完全一致:[1, 1, 1, 2, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1]
代码解释
groupby(["ID", "Activity"]):将数据按「ID+Activity」的组合分组,确保我们只在同一个ID内统计相同Activity的次数。cumcount():为每个分组内的行分配从0开始的连续序号,比如ID161下的"ID Process"会得到0、1、2。+1:把序号转换成从1开始的出现次数,符合你需要的计数逻辑。
内容的提问来源于stack exchange,提问作者Maku
相关产品推荐
相关产品推荐

