(Python) 遍历数据框不允许我删除行

(Python) Iterating over dataframe doesn't allow me to drop rows

我的目标是在单个案例中的活动计数超过特定阈值时切断(而不是完全删除)事件日志。

这是初始 df:

  CaseID  ActivityID
0   Case1          11
1   Case1           5
2   Case1           2
3   Case1          23
4   Case1          86
5   Case1          27
7   Case2           0
8   Case2         256
9   Case2           5
10  Case2           7
11  Case3          23
12  Case3         556
13  Case3           4
14  Case3           2
15  Case3          33
16  Case3           5
17  Case3          67
18  Case3          32
19  Case3           5
20  Case3          66

如果阈值设置为 5,这就是我想要的结果:

  CaseID  ActivityID
0   Case1          11
1   Case1           5
2   Case1           2
3   Case1          23
4   Case1          86
7   Case2           0
8   Case2         256
9   Case2           5
10  Case2           7
11  Case3          23
12  Case3         556
13  Case3           4
14  Case3           2
15  Case3          33

我想出了这个代码:

threshold = 5
counter = 0

for i in range(1, len(df)):
    if (df.loc[i, 'CaseID'] == df.loc[i-1, 'CaseID']) & (counter < threshold):
        counter += 1
    elif (df.loc[i, 'CaseID'] == df.loc[i-1, 'CaseID']) & (counter >= threshold):
        df.drop(index=i, inplace=True) # <- that's the problematic line
    elif (df.loc[i, 'CaseID'] != df.loc[i-1, 'CaseID']) & (counter >= threshold):
        counter = 0

如果我在 df.drop 行中插入打印语句,代码似乎可以正常工作。但是不知何故,一旦我删除行并保持数据框原样或抛出 KeyError:6.

它就不会工作

期待您的帮助,在此先感谢您!

我认为 groupby.cumcount(累计计数,从零开始索引)可以满足您的需求。

  1. 根据其在 CaseID 组中的累积位置对每一行进行编号,从 0
  2. 开始
  3. 过滤 DataFrame 以仅保留累积计数在 0 到 4 之间(含)的行
res = df[df.groupby('CaseID').cumcount() <= 4].copy()

print(res)

   CaseID  ActivityID
0   Case1  11        
1   Case1  5         
2   Case1  2         
3   Case1  23        
4   Case1  86        
7   Case2  0         
8   Case2  256       
9   Case2  5         
10  Case2  7         
11  Case3  23        
12  Case3  556       
13  Case3  4         
14  Case3  2         
15  Case3  33