(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
(累计计数,从零开始索引)可以满足您的需求。
- 根据其在
CaseID
组中的累积位置对每一行进行编号,从 0 开始
- 过滤 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
我的目标是在单个案例中的活动计数超过特定阈值时切断(而不是完全删除)事件日志。
这是初始 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
(累计计数,从零开始索引)可以满足您的需求。
- 根据其在
CaseID
组中的累积位置对每一行进行编号,从 0 开始
- 过滤 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