Pandas:按条件删除每组的行

qni6mghb  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(128)

下午好,我有一个这样的数据框,其中我有不同的组,反映在列“NumeroPosesion”。

Event  NumeroPosesion
0   completedPass               1
1   completedPass               1
2   takeon                      1
3   failedPass                  1
4   takeon                      1
5   dribbleYES                  1
6   shot                        1
7   takeon                      2
8   dribbleNO                   2
9   completedPass               2
10  completedPass               2
11  shot                        2
12  completedPass               2
13  completedPass               2
14  completedPass               2

其思路如下:
1.当第一个“Event”=“shot”出现时,删除该组下面的所有行。
1.从组的最后一行(它将是“事件”=“击球”的一行)迭代,并向上直到“事件”与“takeon”、“completedPass”或“dribbleYES”不同.
1.如果不相同,则删除组中不相同行上方的所有行。
预期 Dataframe :

Event  NumeroPosesion
0  takeon                 1
1  dribbleYES             1
2  shot                   1
3  completedPass          2
4  completedPass          2
5  shot                   2
kknvjkwl

kknvjkwl1#

借助groupby.cummax/cummin使用布尔索引:

# remove rows after "shot" for each group
m1 = df.loc[::-1, 'Event'].eq('shot').groupby(df['NumeroPosesion']).cummax()

# remove rows before the first non "takeon"/"completedPass"/"dribbleYES"
m2 = (df.loc[m1, 'Event'].isin(['shot', 'takeon', 'completedPass', 'dribbleYES'])[::-1]
        .groupby(df['NumeroPosesion']).cummin()
      )

# slice
out = df[m1&m2]

输出:

Event  NumeroPosesion
4          takeon               1
5      dribbleYES               1
6            shot               1
9   completedPass               2
10  completedPass               2
11           shot               2

中间体:

Event  NumeroPosesion     m1     m2
0   completedPass               1   True  False
1   completedPass               1   True  False
2          takeon               1   True  False
3      failedPass               1   True  False
4          takeon               1   True   True
5      dribbleYES               1   True   True
6            shot               1   True   True
7          takeon               2   True  False
8       dribbleNO               2   True  False
9   completedPass               2   True   True
10  completedPass               2   True   True
11           shot               2   True   True
12  completedPass               2  False    NaN
13  completedPass               2  False    NaN
14  completedPass               2  False    NaN

相关问题