我确实有以下数据框
df1 = pd.DataFrame({'case':[1,1,1,1,1,1,2,2,2,2,6,6,6,6,6,3,3,3,3,3,3],
'action':['A','B','C','B','D','A','B','B','D','A','B','B','D','A','F','A','B','C','B','D','A']})
case action
0 1 A
1 1 B
2 1 C
3 1 B
4 1 D
5 1 A
6 2 B
7 2 B
8 2 D
9 2 A
10 6 B
11 6 B
12 6 D
13 6 A
14 6 F
15 3 A
16 3 B
17 3 C
18 3 B
19 3 D
20 3 A
如果在 case
-group 中,倒数第二个 action
值是 D
并且最后一个 action
值of a 是 A
那么最后一行必须被删除。
结果应该是:
df2 = pd.DataFrame({'case':[1,1,1,1,1,2,2,2,6,6,6,6,6,3,3,3,3,3],
'action':['A','B','C','B','D','B','B','D','B','B','D','A','F','A','B','C','B','D']})
case action
0 1 A
1 1 B
2 1 C
3 1 B
4 1 D
5 2 B
6 2 B
7 2 D
8 6 B
9 6 B
10 6 D
11 6 A
12 6 F
13 3 A
14 3 B
15 3 C
16 3 B
17 3 D
几乎什么都试过了。感谢任何帮助。
最佳答案
groupby
、tail
和 shift
t = df1.groupby('case').tail(2)
m = t['action'].eq('A') & t.groupby('case')['action'].shift().eq('D')
df1.drop(m[m].index)
说明
Group
数据帧 df1
按 case
并使用 从每个组中选择最后的
2
行尾(2)
>>> t
case action
4 1 D
5 1 A
8 2 D
9 2 A
13 6 A
14 6 F
19 3 D
20 3 A
现在 group
数据帧 t
由 case
和 shift
列 action
向下一个单位
>>> t.groupby('case')['action'].shift()
4 NaN
5 D
8 NaN
9 D
13 NaN
14 A
19 NaN
20 D
Name: action, dtype: object
通过比较 action
列与 A
和移动 action
列与 D
分别创建一个 bool 掩码,然后取两个掩码的逻辑与
>>> m
4 False
5 True
8 False
9 True
13 False
14 False
19 False
20 True
Name: action, dtype: bool
Drop
数据帧 df1
中对应于掩码 m
中具有 True
值的索引的行
>>> df1.drop(m[m].index)
case action
0 1 A
1 1 B
2 1 C
3 1 B
4 1 D
6 2 B
7 2 B
8 2 D
10 6 B
11 6 B
12 6 D
13 6 A
14 6 F
15 3 A
16 3 B
17 3 C
18 3 B
19 3 D
关于python - 有条件地删除组中的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67136202/