有条件地删除组中的最后一行

Ral*_*ler 3 python dataframe pandas

我确实有以下数据框

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
Run Code Online (Sandbox Code Playgroud)

如果在case-group 中,倒数第二个action值是 a D,而a的最后一个action值是 an,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
Run Code Online (Sandbox Code Playgroud)

几乎什么都试过了。感谢任何帮助。

Shu*_*rma 5

groupbytailshift

t = df1.groupby('case').tail(2)
m = t['action'].eq('A') & t.groupby('case')['action'].shift().eq('D')
df1.drop(m[m].index)
Run Code Online (Sandbox Code Playgroud)

说明

Group数据帧df1case和选择最后2使用从每一组行tail(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
Run Code Online (Sandbox Code Playgroud)

现在,group数据帧tcaseshiftaction向下一个单元

>>> 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
Run Code Online (Sandbox Code Playgroud)

通过分别比较actionA和移位action列来创建布尔掩码D,然后取两个掩码的逻辑和

>>> m

4     False
5      True
8     False
9      True
13    False
14    False
19    False
20     True
Name: action, dtype: bool
Run Code Online (Sandbox Code Playgroud)

Dropdf1掩码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
Run Code Online (Sandbox Code Playgroud)